//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension Rekognition {
    // MARK: Enums

    public enum Attribute: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `default` = "DEFAULT"
        case ageRange = "AGE_RANGE"
        case all = "ALL"
        case beard = "BEARD"
        case emotions = "EMOTIONS"
        case eyeDirection = "EYE_DIRECTION"
        case eyeglasses = "EYEGLASSES"
        case eyesOpen = "EYES_OPEN"
        case faceOccluded = "FACE_OCCLUDED"
        case gender = "GENDER"
        case mouthOpen = "MOUTH_OPEN"
        case mustache = "MUSTACHE"
        case smile = "SMILE"
        case sunglasses = "SUNGLASSES"
        public var description: String { return self.rawValue }
    }

    public enum BodyPart: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case face = "FACE"
        case head = "HEAD"
        case leftHand = "LEFT_HAND"
        case rightHand = "RIGHT_HAND"
        public var description: String { return self.rawValue }
    }

    public enum CelebrityRecognitionSortBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case id = "ID"
        case timestamp = "TIMESTAMP"
        public var description: String { return self.rawValue }
    }

    public enum ChallengeType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case faceMovementAndLightChallenge = "FaceMovementAndLightChallenge"
        case faceMovementChallenge = "FaceMovementChallenge"
        public var description: String { return self.rawValue }
    }

    public enum ContentClassifier: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case freeOfAdultContent = "FreeOfAdultContent"
        case freeOfPersonallyIdentifiableInformation = "FreeOfPersonallyIdentifiableInformation"
        public var description: String { return self.rawValue }
    }

    public enum ContentModerationAggregateBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case segments = "SEGMENTS"
        case timestamps = "TIMESTAMPS"
        public var description: String { return self.rawValue }
    }

    public enum ContentModerationSortBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case name = "NAME"
        case timestamp = "TIMESTAMP"
        public var description: String { return self.rawValue }
    }

    public enum CustomizationFeature: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case contentModeration = "CONTENT_MODERATION"
        case customLabels = "CUSTOM_LABELS"
        public var description: String { return self.rawValue }
    }

    public enum DatasetStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case createComplete = "CREATE_COMPLETE"
        case createFailed = "CREATE_FAILED"
        case createInProgress = "CREATE_IN_PROGRESS"
        case deleteInProgress = "DELETE_IN_PROGRESS"
        case updateComplete = "UPDATE_COMPLETE"
        case updateFailed = "UPDATE_FAILED"
        case updateInProgress = "UPDATE_IN_PROGRESS"
        public var description: String { return self.rawValue }
    }

    public enum DatasetStatusMessageCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case clientError = "CLIENT_ERROR"
        case serviceError = "SERVICE_ERROR"
        case success = "SUCCESS"
        public var description: String { return self.rawValue }
    }

    public enum DatasetType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case test = "TEST"
        case train = "TRAIN"
        public var description: String { return self.rawValue }
    }

    public enum DetectLabelsFeatureName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case generalLabels = "GENERAL_LABELS"
        case imageProperties = "IMAGE_PROPERTIES"
        public var description: String { return self.rawValue }
    }

    public enum EmotionName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case angry = "ANGRY"
        case calm = "CALM"
        case confused = "CONFUSED"
        case disgusted = "DISGUSTED"
        case fear = "FEAR"
        case happy = "HAPPY"
        case sad = "SAD"
        case surprised = "SURPRISED"
        case unknown = "UNKNOWN"
        public var description: String { return self.rawValue }
    }

    public enum FaceAttributes: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case `default` = "DEFAULT"
        case all = "ALL"
        public var description: String { return self.rawValue }
    }

    public enum FaceSearchSortBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case index = "INDEX"
        case timestamp = "TIMESTAMP"
        public var description: String { return self.rawValue }
    }

    public enum GenderType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case female = "Female"
        case male = "Male"
        public var description: String { return self.rawValue }
    }

    public enum KnownGenderType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case female = "Female"
        case male = "Male"
        case nonbinary = "Nonbinary"
        case unlisted = "Unlisted"
        public var description: String { return self.rawValue }
    }

    public enum LabelDetectionAggregateBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case segments = "SEGMENTS"
        case timestamps = "TIMESTAMPS"
        public var description: String { return self.rawValue }
    }

    public enum LabelDetectionFeatureName: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case generalLabels = "GENERAL_LABELS"
        public var description: String { return self.rawValue }
    }

    public enum LabelDetectionSortBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case name = "NAME"
        case timestamp = "TIMESTAMP"
        public var description: String { return self.rawValue }
    }

    public enum LandmarkType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case chinBottom = "chinBottom"
        case eyeLeft = "eyeLeft"
        case eyeRight = "eyeRight"
        case leftEyeBrowLeft = "leftEyeBrowLeft"
        case leftEyeBrowRight = "leftEyeBrowRight"
        case leftEyeBrowUp = "leftEyeBrowUp"
        case leftEyeDown = "leftEyeDown"
        case leftEyeLeft = "leftEyeLeft"
        case leftEyeRight = "leftEyeRight"
        case leftEyeUp = "leftEyeUp"
        case leftPupil = "leftPupil"
        case midJawlineLeft = "midJawlineLeft"
        case midJawlineRight = "midJawlineRight"
        case mouthDown = "mouthDown"
        case mouthLeft = "mouthLeft"
        case mouthRight = "mouthRight"
        case mouthUp = "mouthUp"
        case nose = "nose"
        case noseLeft = "noseLeft"
        case noseRight = "noseRight"
        case rightEyeBrowLeft = "rightEyeBrowLeft"
        case rightEyeBrowRight = "rightEyeBrowRight"
        case rightEyeBrowUp = "rightEyeBrowUp"
        case rightEyeDown = "rightEyeDown"
        case rightEyeLeft = "rightEyeLeft"
        case rightEyeRight = "rightEyeRight"
        case rightEyeUp = "rightEyeUp"
        case rightPupil = "rightPupil"
        case upperJawlineLeft = "upperJawlineLeft"
        case upperJawlineRight = "upperJawlineRight"
        public var description: String { return self.rawValue }
    }

    public enum LivenessSessionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case created = "CREATED"
        case expired = "EXPIRED"
        case failed = "FAILED"
        case inProgress = "IN_PROGRESS"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum MediaAnalysisJobFailureCode: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case accessDenied = "ACCESS_DENIED"
        case internalError = "INTERNAL_ERROR"
        case invalidKmsKey = "INVALID_KMS_KEY"
        case invalidManifest = "INVALID_MANIFEST"
        case invalidOutputConfig = "INVALID_OUTPUT_CONFIG"
        case invalidS3Object = "INVALID_S3_OBJECT"
        case resourceNotFound = "RESOURCE_NOT_FOUND"
        case resourceNotReady = "RESOURCE_NOT_READY"
        case throttled = "THROTTLED"
        public var description: String { return self.rawValue }
    }

    public enum MediaAnalysisJobStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case created = "CREATED"
        case failed = "FAILED"
        case inProgress = "IN_PROGRESS"
        case queued = "QUEUED"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    public enum OrientationCorrection: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case rotate0 = "ROTATE_0"
        case rotate180 = "ROTATE_180"
        case rotate270 = "ROTATE_270"
        case rotate90 = "ROTATE_90"
        public var description: String { return self.rawValue }
    }

    public enum PersonTrackingSortBy: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case index = "INDEX"
        case timestamp = "TIMESTAMP"
        public var description: String { return self.rawValue }
    }

    public enum ProjectAutoUpdate: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case disabled = "DISABLED"
        case enabled = "ENABLED"
        public var description: String { return self.rawValue }
    }

    public enum ProjectStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case created = "CREATED"
        case creating = "CREATING"
        case deleting = "DELETING"
        public var description: String { return self.rawValue }
    }

    public enum ProjectVersionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case copyingCompleted = "COPYING_COMPLETED"
        case copyingFailed = "COPYING_FAILED"
        case copyingInProgress = "COPYING_IN_PROGRESS"
        case deleting = "DELETING"
        case deprecated = "DEPRECATED"
        case expired = "EXPIRED"
        case failed = "FAILED"
        case running = "RUNNING"
        case starting = "STARTING"
        case stopped = "STOPPED"
        case stopping = "STOPPING"
        case trainingCompleted = "TRAINING_COMPLETED"
        case trainingFailed = "TRAINING_FAILED"
        case trainingInProgress = "TRAINING_IN_PROGRESS"
        public var description: String { return self.rawValue }
    }

    public enum ProtectiveEquipmentType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case faceCover = "FACE_COVER"
        case handCover = "HAND_COVER"
        case headCover = "HEAD_COVER"
        public var description: String { return self.rawValue }
    }

    public enum QualityFilter: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case auto = "AUTO"
        case high = "HIGH"
        case low = "LOW"
        case medium = "MEDIUM"
        case none = "NONE"
        public var description: String { return self.rawValue }
    }

    public enum Reason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case exceedsMaxFaces = "EXCEEDS_MAX_FACES"
        case extremePose = "EXTREME_POSE"
        case lowBrightness = "LOW_BRIGHTNESS"
        case lowConfidence = "LOW_CONFIDENCE"
        case lowFaceQuality = "LOW_FACE_QUALITY"
        case lowSharpness = "LOW_SHARPNESS"
        case smallBoundingBox = "SMALL_BOUNDING_BOX"
        public var description: String { return self.rawValue }
    }

    public enum SegmentType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case shot = "SHOT"
        case technicalCue = "TECHNICAL_CUE"
        public var description: String { return self.rawValue }
    }

    public enum StreamProcessorParameterToDelete: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case connectedHomeMinConfidence = "ConnectedHomeMinConfidence"
        case regionsOfInterest = "RegionsOfInterest"
        public var description: String { return self.rawValue }
    }

    public enum StreamProcessorStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case running = "RUNNING"
        case starting = "STARTING"
        case stopped = "STOPPED"
        case stopping = "STOPPING"
        case updating = "UPDATING"
        public var description: String { return self.rawValue }
    }

    public enum TechnicalCueType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case blackFrames = "BlackFrames"
        case colorBars = "ColorBars"
        case content = "Content"
        case endCredits = "EndCredits"
        case openingCredits = "OpeningCredits"
        case slate = "Slate"
        case studioLogo = "StudioLogo"
        public var description: String { return self.rawValue }
    }

    public enum TextTypes: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case line = "LINE"
        case word = "WORD"
        public var description: String { return self.rawValue }
    }

    public enum UnsearchedFaceReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case exceedsMaxFaces = "EXCEEDS_MAX_FACES"
        case extremePose = "EXTREME_POSE"
        case faceNotLargest = "FACE_NOT_LARGEST"
        case lowBrightness = "LOW_BRIGHTNESS"
        case lowConfidence = "LOW_CONFIDENCE"
        case lowFaceQuality = "LOW_FACE_QUALITY"
        case lowSharpness = "LOW_SHARPNESS"
        case smallBoundingBox = "SMALL_BOUNDING_BOX"
        public var description: String { return self.rawValue }
    }

    public enum UnsuccessfulFaceAssociationReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case associatedToADifferentUser = "ASSOCIATED_TO_A_DIFFERENT_USER"
        case faceNotFound = "FACE_NOT_FOUND"
        case lowMatchConfidence = "LOW_MATCH_CONFIDENCE"
        public var description: String { return self.rawValue }
    }

    public enum UnsuccessfulFaceDeletionReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case associatedToAnExistingUser = "ASSOCIATED_TO_AN_EXISTING_USER"
        case faceNotFound = "FACE_NOT_FOUND"
        public var description: String { return self.rawValue }
    }

    public enum UnsuccessfulFaceDisassociationReason: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case associatedToADifferentUser = "ASSOCIATED_TO_A_DIFFERENT_USER"
        case faceNotFound = "FACE_NOT_FOUND"
        public var description: String { return self.rawValue }
    }

    public enum UserStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case active = "ACTIVE"
        case created = "CREATED"
        case creating = "CREATING"
        case updating = "UPDATING"
        public var description: String { return self.rawValue }
    }

    public enum VideoColorRange: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case full = "FULL"
        case limited = "LIMITED"
        public var description: String { return self.rawValue }
    }

    public enum VideoJobStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case failed = "FAILED"
        case inProgress = "IN_PROGRESS"
        case succeeded = "SUCCEEDED"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AccessDeniedException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct AgeRange: AWSDecodableShape {
        /// The highest estimated age.
        public let high: Int?
        /// The lowest estimated age.
        public let low: Int?

        @inlinable
        public init(high: Int? = nil, low: Int? = nil) {
            self.high = high
            self.low = low
        }

        private enum CodingKeys: String, CodingKey {
            case high = "High"
            case low = "Low"
        }
    }

    public struct Asset: AWSEncodableShape & AWSDecodableShape {
        public let groundTruthManifest: GroundTruthManifest?

        @inlinable
        public init(groundTruthManifest: GroundTruthManifest? = nil) {
            self.groundTruthManifest = groundTruthManifest
        }

        public func validate(name: String) throws {
            try self.groundTruthManifest?.validate(name: "\(name).groundTruthManifest")
        }

        private enum CodingKeys: String, CodingKey {
            case groundTruthManifest = "GroundTruthManifest"
        }
    }

    public struct AssociateFacesRequest: AWSEncodableShape {
        /// Idempotent token used to identify the request to AssociateFaces. If you use the same token with multiple AssociateFaces requests, the same response is returned. Use ClientRequestToken to prevent the same request from being processed more than once.
        public let clientRequestToken: String?
        /// The ID of an existing collection containing the UserID.
        public let collectionId: String
        /// An array of FaceIDs to associate with the UserID.
        public let faceIds: [String]
        /// The ID for the existing UserID.
        public let userId: String
        /// An optional value specifying the minimum confidence in the UserID match to return. The default value is 75.
        public let userMatchThreshold: Float?

        @inlinable
        public init(clientRequestToken: String? = AssociateFacesRequest.idempotencyToken(), collectionId: String, faceIds: [String], userId: String, userMatchThreshold: Float? = nil) {
            self.clientRequestToken = clientRequestToken
            self.collectionId = collectionId
            self.faceIds = faceIds
            self.userId = userId
            self.userMatchThreshold = userMatchThreshold
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.faceIds.forEach {
                try validate($0, name: "faceIds[]", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
            }
            try self.validate(self.faceIds, name: "faceIds", parent: name, max: 100)
            try self.validate(self.faceIds, name: "faceIds", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, max: 128)
            try self.validate(self.userId, name: "userId", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
            try self.validate(self.userMatchThreshold, name: "userMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.userMatchThreshold, name: "userMatchThreshold", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case collectionId = "CollectionId"
            case faceIds = "FaceIds"
            case userId = "UserId"
            case userMatchThreshold = "UserMatchThreshold"
        }
    }

    public struct AssociateFacesResponse: AWSDecodableShape {
        /// An array of AssociatedFace objects containing FaceIDs that have been successfully associated with the UserID. Returned if the AssociateFaces action is successful.
        public let associatedFaces: [AssociatedFace]?
        /// An array of UnsuccessfulAssociation objects containing FaceIDs that are not successfully associated along with the reasons. Returned if the AssociateFaces action is successful.
        public let unsuccessfulFaceAssociations: [UnsuccessfulFaceAssociation]?
        /// The status of an update made to a UserID. Reflects if the UserID has been updated for every requested change.
        public let userStatus: UserStatus?

        @inlinable
        public init(associatedFaces: [AssociatedFace]? = nil, unsuccessfulFaceAssociations: [UnsuccessfulFaceAssociation]? = nil, userStatus: UserStatus? = nil) {
            self.associatedFaces = associatedFaces
            self.unsuccessfulFaceAssociations = unsuccessfulFaceAssociations
            self.userStatus = userStatus
        }

        private enum CodingKeys: String, CodingKey {
            case associatedFaces = "AssociatedFaces"
            case unsuccessfulFaceAssociations = "UnsuccessfulFaceAssociations"
            case userStatus = "UserStatus"
        }
    }

    public struct AssociatedFace: AWSDecodableShape {
        /// Unique identifier assigned to the face.
        public let faceId: String?

        @inlinable
        public init(faceId: String? = nil) {
            self.faceId = faceId
        }

        private enum CodingKeys: String, CodingKey {
            case faceId = "FaceId"
        }
    }

    public struct AudioMetadata: AWSDecodableShape {
        /// The audio codec used to encode or decode the audio stream.
        public let codec: String?
        /// The duration of the audio stream in milliseconds.
        public let durationMillis: Int64?
        /// The number of audio channels in the segment.
        public let numberOfChannels: Int64?
        /// The sample rate for the audio stream.
        public let sampleRate: Int64?

        @inlinable
        public init(codec: String? = nil, durationMillis: Int64? = nil, numberOfChannels: Int64? = nil, sampleRate: Int64? = nil) {
            self.codec = codec
            self.durationMillis = durationMillis
            self.numberOfChannels = numberOfChannels
            self.sampleRate = sampleRate
        }

        private enum CodingKeys: String, CodingKey {
            case codec = "Codec"
            case durationMillis = "DurationMillis"
            case numberOfChannels = "NumberOfChannels"
            case sampleRate = "SampleRate"
        }
    }

    public struct AuditImage: AWSDecodableShape {
        public let boundingBox: BoundingBox?
        /// The Base64-encoded bytes representing an image selected from the Face Liveness video and returned for audit purposes.
        public let bytes: AWSBase64Data?
        public let s3Object: S3Object?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, bytes: AWSBase64Data? = nil, s3Object: S3Object? = nil) {
            self.boundingBox = boundingBox
            self.bytes = bytes
            self.s3Object = s3Object
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case bytes = "Bytes"
            case s3Object = "S3Object"
        }
    }

    public struct Beard: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the face has beard or not.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct BlackFrame: AWSEncodableShape {
        ///  A threshold used to determine the maximum luminance value for a pixel to be considered black. In a full color range video, luminance values range from 0-255. A pixel value of 0 is pure black, and the most strict filter. The maximum black pixel value is computed as follows: max_black_pixel_value = minimum_luminance + MaxPixelThreshold *luminance_range.  For example, for a full range video with BlackPixelThreshold = 0.1,  max_black_pixel_value is 0 + 0.1 * (255-0) = 25.5. The default value of MaxPixelThreshold is 0.2, which maps to a max_black_pixel_value of 51 for a full range video. You can lower this threshold to be more strict on black levels.
        public let maxPixelThreshold: Float?
        ///  The minimum percentage of pixels in a frame that need to have a luminance below the max_black_pixel_value for a frame to be considered a black frame. Luminance is calculated using the BT.709 matrix.  The default value is 99, which means at least 99% of all pixels in the frame are black pixels as per the MaxPixelThreshold set. You can reduce this value to allow more noise on the black frame.
        public let minCoveragePercentage: Float?

        @inlinable
        public init(maxPixelThreshold: Float? = nil, minCoveragePercentage: Float? = nil) {
            self.maxPixelThreshold = maxPixelThreshold
            self.minCoveragePercentage = minCoveragePercentage
        }

        public func validate(name: String) throws {
            try self.validate(self.maxPixelThreshold, name: "maxPixelThreshold", parent: name, max: 1.0)
            try self.validate(self.maxPixelThreshold, name: "maxPixelThreshold", parent: name, min: 0.0)
            try self.validate(self.minCoveragePercentage, name: "minCoveragePercentage", parent: name, max: 100.0)
            try self.validate(self.minCoveragePercentage, name: "minCoveragePercentage", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case maxPixelThreshold = "MaxPixelThreshold"
            case minCoveragePercentage = "MinCoveragePercentage"
        }
    }

    public struct BoundingBox: AWSEncodableShape & AWSDecodableShape {
        /// Height of the bounding box as a ratio of the overall image height.
        public let height: Float?
        /// Left coordinate of the bounding box as a ratio of overall image width.
        public let left: Float?
        /// Top coordinate of the bounding box as a ratio of overall image height.
        public let top: Float?
        /// Width of the bounding box as a ratio of the overall image width.
        public let width: Float?

        @inlinable
        public init(height: Float? = nil, left: Float? = nil, top: Float? = nil, width: Float? = nil) {
            self.height = height
            self.left = left
            self.top = top
            self.width = width
        }

        private enum CodingKeys: String, CodingKey {
            case height = "Height"
            case left = "Left"
            case top = "Top"
            case width = "Width"
        }
    }

    public struct Celebrity: AWSDecodableShape {
        /// Provides information about the celebrity's face, such as its location on the image.
        public let face: ComparedFace?
        /// A unique identifier for the celebrity.
        public let id: String?
        public let knownGender: KnownGender?
        /// The confidence, in percentage, that Amazon Rekognition has that the recognized face is the celebrity.
        public let matchConfidence: Float?
        /// The name of the celebrity.
        public let name: String?
        /// An array of URLs pointing to additional information about the celebrity. If there is no additional information about the celebrity, this list is empty.
        public let urls: [String]?

        @inlinable
        public init(face: ComparedFace? = nil, id: String? = nil, knownGender: KnownGender? = nil, matchConfidence: Float? = nil, name: String? = nil, urls: [String]? = nil) {
            self.face = face
            self.id = id
            self.knownGender = knownGender
            self.matchConfidence = matchConfidence
            self.name = name
            self.urls = urls
        }

        private enum CodingKeys: String, CodingKey {
            case face = "Face"
            case id = "Id"
            case knownGender = "KnownGender"
            case matchConfidence = "MatchConfidence"
            case name = "Name"
            case urls = "Urls"
        }
    }

    public struct CelebrityDetail: AWSDecodableShape {
        /// Bounding box around the body of a celebrity.
        public let boundingBox: BoundingBox?
        /// The confidence, in percentage, that Amazon Rekognition has that the recognized face is the celebrity.
        public let confidence: Float?
        /// Face details for the recognized celebrity.
        public let face: FaceDetail?
        /// The unique identifier for the celebrity.
        public let id: String?
        /// Retrieves the known gender for the celebrity.
        public let knownGender: KnownGender?
        /// The name of the celebrity.
        public let name: String?
        /// An array of URLs pointing to additional celebrity information.
        public let urls: [String]?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, confidence: Float? = nil, face: FaceDetail? = nil, id: String? = nil, knownGender: KnownGender? = nil, name: String? = nil, urls: [String]? = nil) {
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.face = face
            self.id = id
            self.knownGender = knownGender
            self.name = name
            self.urls = urls
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case face = "Face"
            case id = "Id"
            case knownGender = "KnownGender"
            case name = "Name"
            case urls = "Urls"
        }
    }

    public struct CelebrityRecognition: AWSDecodableShape {
        /// Information about a recognized celebrity.
        public let celebrity: CelebrityDetail?
        /// The time, in milliseconds from the start of the video, that the celebrity was recognized. Note that Timestamp is not guaranteed to be accurate to the individual frame where the celebrity first appears.
        public let timestamp: Int64?

        @inlinable
        public init(celebrity: CelebrityDetail? = nil, timestamp: Int64? = nil) {
            self.celebrity = celebrity
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case celebrity = "Celebrity"
            case timestamp = "Timestamp"
        }
    }

    public struct Challenge: AWSDecodableShape {
        /// The type of the challenge being used for the Face Liveness session.
        public let type: ChallengeType
        /// The version of the challenge being used for the Face Liveness session.
        public let version: String

        @inlinable
        public init(type: ChallengeType, version: String) {
            self.type = type
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case type = "Type"
            case version = "Version"
        }
    }

    public struct ChallengePreference: AWSEncodableShape {
        /// The types of challenges that have been selected for the Face Liveness session.
        public let type: ChallengeType
        /// The version of the challenges that have been selected for the Face Liveness session.
        public let versions: Versions?

        @inlinable
        public init(type: ChallengeType, versions: Versions? = nil) {
            self.type = type
            self.versions = versions
        }

        public func validate(name: String) throws {
            try self.versions?.validate(name: "\(name).versions")
        }

        private enum CodingKeys: String, CodingKey {
            case type = "Type"
            case versions = "Versions"
        }
    }

    public struct CompareFacesMatch: AWSDecodableShape {
        /// Provides face metadata (bounding box and confidence that the bounding box actually contains a face).
        public let face: ComparedFace?
        /// Level of confidence that the faces match.
        public let similarity: Float?

        @inlinable
        public init(face: ComparedFace? = nil, similarity: Float? = nil) {
            self.face = face
            self.similarity = similarity
        }

        private enum CodingKeys: String, CodingKey {
            case face = "Face"
            case similarity = "Similarity"
        }
    }

    public struct CompareFacesRequest: AWSEncodableShape {
        /// A filter that specifies a quality bar for how much filtering is done to identify faces. Filtered faces aren't compared. If you specify AUTO, Amazon Rekognition chooses the quality bar. If you specify LOW, MEDIUM, or HIGH, filtering removes all faces that don’t meet the chosen quality bar. The quality bar is based on a variety of common use cases. Low-quality detections can occur for a number of reasons. Some examples are an object that's misidentified as a face, a face that's too blurry, or a face with a pose that's too extreme to use. If you specify NONE, no filtering is performed. The default value is NONE.  To use quality filtering, the collection you are using must be associated with version 3 of the face model or higher.
        public let qualityFilter: QualityFilter?
        /// The minimum level of confidence in the face matches that a match must meet to be included in the FaceMatches array.
        public let similarityThreshold: Float?
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes is not supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let sourceImage: Image
        /// The target image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes is not supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let targetImage: Image

        @inlinable
        public init(qualityFilter: QualityFilter? = nil, similarityThreshold: Float? = nil, sourceImage: Image, targetImage: Image) {
            self.qualityFilter = qualityFilter
            self.similarityThreshold = similarityThreshold
            self.sourceImage = sourceImage
            self.targetImage = targetImage
        }

        public func validate(name: String) throws {
            try self.validate(self.similarityThreshold, name: "similarityThreshold", parent: name, max: 100.0)
            try self.validate(self.similarityThreshold, name: "similarityThreshold", parent: name, min: 0.0)
            try self.sourceImage.validate(name: "\(name).sourceImage")
            try self.targetImage.validate(name: "\(name).targetImage")
        }

        private enum CodingKeys: String, CodingKey {
            case qualityFilter = "QualityFilter"
            case similarityThreshold = "SimilarityThreshold"
            case sourceImage = "SourceImage"
            case targetImage = "TargetImage"
        }
    }

    public struct CompareFacesResponse: AWSDecodableShape {
        /// An array of faces in the target image that match the source image face. Each CompareFacesMatch object provides the bounding box, the confidence level that the bounding box contains a face, and the similarity score for the face in the bounding box and the face in the source image.
        public let faceMatches: [CompareFacesMatch]?
        /// The face in the source image that was used for comparison.
        public let sourceImageFace: ComparedSourceImageFace?
        /// The value of SourceImageOrientationCorrection is always null. If the input image is in .jpeg format, it might contain exchangeable image file format (Exif) metadata that includes the image's orientation. Amazon Rekognition uses this orientation information to perform image correction. The bounding box coordinates are translated to represent object locations after the orientation information in the Exif metadata is used to correct the image orientation. Images in .png format don't contain Exif metadata. Amazon Rekognition doesn’t perform image correction for images in .png format and .jpeg images without orientation information in the image Exif metadata. The bounding box coordinates aren't translated and represent the object locations before the image is rotated.
        public let sourceImageOrientationCorrection: OrientationCorrection?
        /// The value of TargetImageOrientationCorrection is always null. If the input image is in .jpeg format, it might contain exchangeable image file format (Exif) metadata that includes the image's orientation. Amazon Rekognition uses this orientation information to perform image correction. The bounding box coordinates are translated to represent object locations after the orientation information in the Exif metadata is used to correct the image orientation. Images in .png format don't contain Exif metadata. Amazon Rekognition doesn’t perform image correction for images in .png format and .jpeg images without orientation information in the image Exif metadata. The bounding box coordinates aren't translated and represent the object locations before the image is rotated.
        public let targetImageOrientationCorrection: OrientationCorrection?
        /// An array of faces in the target image that did not match the source image face.
        public let unmatchedFaces: [ComparedFace]?

        @inlinable
        public init(faceMatches: [CompareFacesMatch]? = nil, sourceImageFace: ComparedSourceImageFace? = nil, sourceImageOrientationCorrection: OrientationCorrection? = nil, targetImageOrientationCorrection: OrientationCorrection? = nil, unmatchedFaces: [ComparedFace]? = nil) {
            self.faceMatches = faceMatches
            self.sourceImageFace = sourceImageFace
            self.sourceImageOrientationCorrection = sourceImageOrientationCorrection
            self.targetImageOrientationCorrection = targetImageOrientationCorrection
            self.unmatchedFaces = unmatchedFaces
        }

        private enum CodingKeys: String, CodingKey {
            case faceMatches = "FaceMatches"
            case sourceImageFace = "SourceImageFace"
            case sourceImageOrientationCorrection = "SourceImageOrientationCorrection"
            case targetImageOrientationCorrection = "TargetImageOrientationCorrection"
            case unmatchedFaces = "UnmatchedFaces"
        }
    }

    public struct ComparedFace: AWSDecodableShape {
        /// Bounding box of the face.
        public let boundingBox: BoundingBox?
        /// Level of confidence that what the bounding box contains is a face.
        public let confidence: Float?
        ///  The emotions that appear to be expressed on the face, and the confidence level in the determination. Valid values include "Happy", "Sad", "Angry", "Confused", "Disgusted", "Surprised", "Calm", "Unknown", and "Fear".
        public let emotions: [Emotion]?
        /// An array of facial landmarks.
        public let landmarks: [Landmark]?
        /// Indicates the pose of the face as determined by its pitch, roll, and yaw.
        public let pose: Pose?
        /// Identifies face image brightness and sharpness.
        public let quality: ImageQuality?
        ///  Indicates whether or not the face is smiling, and the confidence level in the determination.
        public let smile: Smile?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, confidence: Float? = nil, emotions: [Emotion]? = nil, landmarks: [Landmark]? = nil, pose: Pose? = nil, quality: ImageQuality? = nil, smile: Smile? = nil) {
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.emotions = emotions
            self.landmarks = landmarks
            self.pose = pose
            self.quality = quality
            self.smile = smile
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case emotions = "Emotions"
            case landmarks = "Landmarks"
            case pose = "Pose"
            case quality = "Quality"
            case smile = "Smile"
        }
    }

    public struct ComparedSourceImageFace: AWSDecodableShape {
        /// Bounding box of the face.
        public let boundingBox: BoundingBox?
        /// Confidence level that the selected bounding box contains a face.
        public let confidence: Float?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, confidence: Float? = nil) {
            self.boundingBox = boundingBox
            self.confidence = confidence
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
        }
    }

    public struct ConflictException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct ConnectedHomeSettings: AWSEncodableShape & AWSDecodableShape {
        ///  Specifies what you want to detect in the video, such as people, packages, or pets. The current valid labels you can include in this list are: "PERSON", "PET", "PACKAGE", and "ALL".
        public let labels: [String]
        ///  The minimum confidence required to label an object in the video.
        public let minConfidence: Float?

        @inlinable
        public init(labels: [String], minConfidence: Float? = nil) {
            self.labels = labels
            self.minConfidence = minConfidence
        }

        public func validate(name: String) throws {
            try self.validate(self.labels, name: "labels", parent: name, max: 128)
            try self.validate(self.labels, name: "labels", parent: name, min: 1)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case labels = "Labels"
            case minConfidence = "MinConfidence"
        }
    }

    public struct ConnectedHomeSettingsForUpdate: AWSEncodableShape {
        ///  Specifies what you want to detect in the video, such as people, packages, or pets. The current valid labels you can include in this list are: "PERSON", "PET", "PACKAGE", and "ALL".
        public let labels: [String]?
        ///  The minimum confidence required to label an object in the video.
        public let minConfidence: Float?

        @inlinable
        public init(labels: [String]? = nil, minConfidence: Float? = nil) {
            self.labels = labels
            self.minConfidence = minConfidence
        }

        public func validate(name: String) throws {
            try self.validate(self.labels, name: "labels", parent: name, max: 128)
            try self.validate(self.labels, name: "labels", parent: name, min: 1)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case labels = "Labels"
            case minConfidence = "MinConfidence"
        }
    }

    public struct ContentModerationDetection: AWSDecodableShape {
        /// A list of predicted results for the type of content an image contains. For example,  the image content might be from animation, sports, or a video game.
        public let contentTypes: [ContentType]?
        ///  The time duration of a segment in milliseconds, I.e. time elapsed from StartTimestampMillis to EndTimestampMillis.
        public let durationMillis: Int64?
        ///  The time in milliseconds defining the end of the timeline segment containing a continuously detected moderation label.
        public let endTimestampMillis: Int64?
        /// The content moderation label detected by in the stored video.
        public let moderationLabel: ModerationLabel?
        /// The time in milliseconds defining the start of the timeline segment containing a continuously detected moderation label.
        public let startTimestampMillis: Int64?
        /// Time, in milliseconds from the beginning of the video, that the content moderation label was detected. Note that Timestamp is not guaranteed to be accurate to the individual frame where the moderated content first appears.
        public let timestamp: Int64?

        @inlinable
        public init(contentTypes: [ContentType]? = nil, durationMillis: Int64? = nil, endTimestampMillis: Int64? = nil, moderationLabel: ModerationLabel? = nil, startTimestampMillis: Int64? = nil, timestamp: Int64? = nil) {
            self.contentTypes = contentTypes
            self.durationMillis = durationMillis
            self.endTimestampMillis = endTimestampMillis
            self.moderationLabel = moderationLabel
            self.startTimestampMillis = startTimestampMillis
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case contentTypes = "ContentTypes"
            case durationMillis = "DurationMillis"
            case endTimestampMillis = "EndTimestampMillis"
            case moderationLabel = "ModerationLabel"
            case startTimestampMillis = "StartTimestampMillis"
            case timestamp = "Timestamp"
        }
    }

    public struct ContentType: AWSDecodableShape {
        /// The confidence level of the label given
        public let confidence: Float?
        /// The name of the label
        public let name: String?

        @inlinable
        public init(confidence: Float? = nil, name: String? = nil) {
            self.confidence = confidence
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case name = "Name"
        }
    }

    public struct CopyProjectVersionRequest: AWSEncodableShape {
        /// The ARN of the project in the trusted AWS account that you want to copy the model version to.
        public let destinationProjectArn: String
        /// The identifier for your AWS Key Management Service key (AWS KMS key). You can supply the Amazon Resource Name (ARN) of your KMS key, the ID of your KMS key, an alias for your KMS key, or an alias ARN. The key is used to encrypt training results and manifest files written to the output Amazon S3 bucket (OutputConfig). If you choose to use your own KMS key, you need the following permissions on the KMS key.   kms:CreateGrant   kms:DescribeKey   kms:GenerateDataKey   kms:Decrypt   If you don't specify a value for KmsKeyId, images copied into the service are encrypted using a key that AWS owns and manages.
        public let kmsKeyId: String?
        /// The S3 bucket and folder location where the training output for the source model version is placed.
        public let outputConfig: OutputConfig
        /// The ARN of the source project in the trusting AWS account.
        public let sourceProjectArn: String
        /// The ARN of the model version in the source project that you want to copy to a destination project.
        public let sourceProjectVersionArn: String
        /// The key-value tags to assign to the model version.
        public let tags: [String: String]?
        /// A name for the version of the model that's copied to the destination project.
        public let versionName: String

        @inlinable
        public init(destinationProjectArn: String, kmsKeyId: String? = nil, outputConfig: OutputConfig, sourceProjectArn: String, sourceProjectVersionArn: String, tags: [String: String]? = nil, versionName: String) {
            self.destinationProjectArn = destinationProjectArn
            self.kmsKeyId = kmsKeyId
            self.outputConfig = outputConfig
            self.sourceProjectArn = sourceProjectArn
            self.sourceProjectVersionArn = sourceProjectVersionArn
            self.tags = tags
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.validate(self.destinationProjectArn, name: "destinationProjectArn", parent: name, max: 2048)
            try self.validate(self.destinationProjectArn, name: "destinationProjectArn", parent: name, min: 20)
            try self.validate(self.destinationProjectArn, name: "destinationProjectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, max: 2048)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, min: 1)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,2048}$")
            try self.outputConfig.validate(name: "\(name).outputConfig")
            try self.validate(self.sourceProjectArn, name: "sourceProjectArn", parent: name, max: 2048)
            try self.validate(self.sourceProjectArn, name: "sourceProjectArn", parent: name, min: 20)
            try self.validate(self.sourceProjectArn, name: "sourceProjectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
            try self.validate(self.sourceProjectVersionArn, name: "sourceProjectVersionArn", parent: name, max: 2048)
            try self.validate(self.sourceProjectVersionArn, name: "sourceProjectVersionArn", parent: name, min: 20)
            try self.validate(self.sourceProjectVersionArn, name: "sourceProjectVersionArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
            try self.validate(self.versionName, name: "versionName", parent: name, max: 255)
            try self.validate(self.versionName, name: "versionName", parent: name, min: 1)
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case destinationProjectArn = "DestinationProjectArn"
            case kmsKeyId = "KmsKeyId"
            case outputConfig = "OutputConfig"
            case sourceProjectArn = "SourceProjectArn"
            case sourceProjectVersionArn = "SourceProjectVersionArn"
            case tags = "Tags"
            case versionName = "VersionName"
        }
    }

    public struct CopyProjectVersionResponse: AWSDecodableShape {
        /// The ARN of the copied model version in the destination project.
        public let projectVersionArn: String?

        @inlinable
        public init(projectVersionArn: String? = nil) {
            self.projectVersionArn = projectVersionArn
        }

        private enum CodingKeys: String, CodingKey {
            case projectVersionArn = "ProjectVersionArn"
        }
    }

    public struct CoversBodyPart: AWSDecodableShape {
        /// The confidence that Amazon Rekognition has in the value of Value.
        public let confidence: Float?
        /// True if the PPE covers the corresponding body part, otherwise false.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct CreateCollectionRequest: AWSEncodableShape {
        /// ID for the collection that you are creating.
        public let collectionId: String
        ///  A set of tags (key-value pairs) that you want to attach to the collection.
        public let tags: [String: String]?

        @inlinable
        public init(collectionId: String, tags: [String: String]? = nil) {
            self.collectionId = collectionId
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case tags = "Tags"
        }
    }

    public struct CreateCollectionResponse: AWSDecodableShape {
        /// Amazon Resource Name (ARN) of the collection. You can use this to manage permissions on your resources.
        public let collectionArn: String?
        /// Version number of the face detection model associated with the collection you are creating.
        public let faceModelVersion: String?
        /// HTTP status code indicating the result of the operation.
        public let statusCode: Int?

        @inlinable
        public init(collectionArn: String? = nil, faceModelVersion: String? = nil, statusCode: Int? = nil) {
            self.collectionArn = collectionArn
            self.faceModelVersion = faceModelVersion
            self.statusCode = statusCode
        }

        private enum CodingKeys: String, CodingKey {
            case collectionArn = "CollectionArn"
            case faceModelVersion = "FaceModelVersion"
            case statusCode = "StatusCode"
        }
    }

    public struct CreateDatasetRequest: AWSEncodableShape {
        /// The source files for the dataset. You can specify the ARN of an existing dataset or specify the Amazon S3 bucket location
        /// of an Amazon Sagemaker format manifest file. If you don't specify datasetSource, an empty dataset is created. To add labeled images to the dataset,  You can use the console or call UpdateDatasetEntries.
        public let datasetSource: DatasetSource?
        /// The type of the dataset. Specify TRAIN to create a training dataset. Specify TEST  to create a test dataset.
        public let datasetType: DatasetType
        /// The ARN of the Amazon Rekognition Custom Labels project to which you want to asssign the dataset.
        public let projectArn: String
        /// A set of tags (key-value pairs) that you want to attach to the dataset.
        public let tags: [String: String]?

        @inlinable
        public init(datasetSource: DatasetSource? = nil, datasetType: DatasetType, projectArn: String, tags: [String: String]? = nil) {
            self.datasetSource = datasetSource
            self.datasetType = datasetType
            self.projectArn = projectArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.datasetSource?.validate(name: "\(name).datasetSource")
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case datasetSource = "DatasetSource"
            case datasetType = "DatasetType"
            case projectArn = "ProjectArn"
            case tags = "Tags"
        }
    }

    public struct CreateDatasetResponse: AWSDecodableShape {
        /// The ARN of the created  Amazon Rekognition Custom Labels dataset.
        public let datasetArn: String?

        @inlinable
        public init(datasetArn: String? = nil) {
            self.datasetArn = datasetArn
        }

        private enum CodingKeys: String, CodingKey {
            case datasetArn = "DatasetArn"
        }
    }

    public struct CreateFaceLivenessSessionRequest: AWSEncodableShape {
        /// Idempotent token is used to recognize the Face Liveness request. If the same token is used with multiple CreateFaceLivenessSession requests, the same session is returned. This token is employed to avoid unintentionally creating the same session multiple times.
        public let clientRequestToken: String?
        ///  The identifier for your AWS Key Management Service key (AWS KMS key). Used to encrypt audit images and reference images.
        public let kmsKeyId: String?
        /// A session settings object. It contains settings for the operation to be performed. For Face Liveness, it accepts OutputConfig and AuditImagesLimit.
        public let settings: CreateFaceLivenessSessionRequestSettings?

        @inlinable
        public init(clientRequestToken: String? = nil, kmsKeyId: String? = nil, settings: CreateFaceLivenessSessionRequestSettings? = nil) {
            self.clientRequestToken = clientRequestToken
            self.kmsKeyId = kmsKeyId
            self.settings = settings
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, max: 2048)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, min: 1)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,2048}$")
            try self.settings?.validate(name: "\(name).settings")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case kmsKeyId = "KmsKeyId"
            case settings = "Settings"
        }
    }

    public struct CreateFaceLivenessSessionRequestSettings: AWSEncodableShape {
        /// Number of audit images to be returned back. Takes an integer between 0-4. Any integer less than 0 will return 0, any integer above 4 will return 4 images in the response. By default, it is set to 0. The limit is best effort and is based on the actual duration of the selfie-video.
        public let auditImagesLimit: Int?
        /// Indicates preferred challenge types and versions for the Face Liveness session to be created.
        public let challengePreferences: [ChallengePreference]?
        /// Can specify the location of an Amazon S3 bucket, where reference and audit images will be stored. Note that the Amazon S3 bucket must be located in the caller's AWS account and in the same region as the Face Liveness end-point. Additionally, the Amazon S3 object keys are auto-generated by the Face Liveness system. Requires that the caller has the s3:PutObject permission on the Amazon S3 bucket.
        public let outputConfig: LivenessOutputConfig?

        @inlinable
        public init(auditImagesLimit: Int? = nil, challengePreferences: [ChallengePreference]? = nil, outputConfig: LivenessOutputConfig? = nil) {
            self.auditImagesLimit = auditImagesLimit
            self.challengePreferences = challengePreferences
            self.outputConfig = outputConfig
        }

        public func validate(name: String) throws {
            try self.validate(self.auditImagesLimit, name: "auditImagesLimit", parent: name, max: 4)
            try self.validate(self.auditImagesLimit, name: "auditImagesLimit", parent: name, min: 0)
            try self.challengePreferences?.forEach {
                try $0.validate(name: "\(name).challengePreferences[]")
            }
            try self.outputConfig?.validate(name: "\(name).outputConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case auditImagesLimit = "AuditImagesLimit"
            case challengePreferences = "ChallengePreferences"
            case outputConfig = "OutputConfig"
        }
    }

    public struct CreateFaceLivenessSessionResponse: AWSDecodableShape {
        /// A unique 128-bit UUID identifying a Face Liveness session.  A new sessionID must be used for every Face Liveness check. If a given sessionID is used for subsequent  Face Liveness checks, the checks will fail. Additionally, a SessionId expires 3 minutes after it's sent,  making all Liveness data associated with the session (e.g., sessionID, reference image, audit images, etc.) unavailable.
        public let sessionId: String

        @inlinable
        public init(sessionId: String) {
            self.sessionId = sessionId
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
        }
    }

    public struct CreateProjectRequest: AWSEncodableShape {
        /// Specifies whether automatic retraining should be attempted for the versions of the project. Automatic retraining is done as a best effort. Required argument for Content Moderation. Applicable only to adapters.
        public let autoUpdate: ProjectAutoUpdate?
        /// Specifies feature that is being customized. If no value is provided CUSTOM_LABELS is used as a default.
        public let feature: CustomizationFeature?
        /// The name of the project to create.
        public let projectName: String
        /// A set of tags (key-value pairs) that you want to attach to the project.
        public let tags: [String: String]?

        @inlinable
        public init(autoUpdate: ProjectAutoUpdate? = nil, feature: CustomizationFeature? = nil, projectName: String, tags: [String: String]? = nil) {
            self.autoUpdate = autoUpdate
            self.feature = feature
            self.projectName = projectName
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.projectName, name: "projectName", parent: name, max: 255)
            try self.validate(self.projectName, name: "projectName", parent: name, min: 1)
            try self.validate(self.projectName, name: "projectName", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case autoUpdate = "AutoUpdate"
            case feature = "Feature"
            case projectName = "ProjectName"
            case tags = "Tags"
        }
    }

    public struct CreateProjectResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the new project. You can use the ARN to  configure IAM access to the project.
        public let projectArn: String?

        @inlinable
        public init(projectArn: String? = nil) {
            self.projectArn = projectArn
        }

        private enum CodingKeys: String, CodingKey {
            case projectArn = "ProjectArn"
        }
    }

    public struct CreateProjectVersionRequest: AWSEncodableShape {
        /// Feature-specific configuration of the training job. If the job configuration does not match the feature type associated with the project, an InvalidParameterException is returned.
        public let featureConfig: CustomizationFeatureConfig?
        /// The identifier for your AWS Key Management Service key (AWS KMS key). You can supply the Amazon Resource Name (ARN) of your KMS key, the ID of your KMS key, an alias for your KMS key, or an alias ARN. The key is used to encrypt training images, test images, and manifest files copied into the service for the project version. Your source images are unaffected. The key is also used to encrypt training results and manifest files written to the output Amazon S3 bucket (OutputConfig). If you choose to use your own KMS key, you need the following permissions on the KMS key.   kms:CreateGrant   kms:DescribeKey   kms:GenerateDataKey   kms:Decrypt   If you don't specify a value for KmsKeyId, images copied into the service are encrypted using a key that AWS owns and manages.
        public let kmsKeyId: String?
        /// The Amazon S3 bucket location to store the results of training. The bucket can be any S3 bucket in your AWS account. You need s3:PutObject permission on the bucket.
        public let outputConfig: OutputConfig
        /// The ARN of the Amazon Rekognition project that will manage the project version you want to train.
        public let projectArn: String
        ///  A set of tags (key-value pairs) that you want to attach to the project version.
        public let tags: [String: String]?
        /// Specifies an external manifest that the service uses to test the project version. If you specify TestingData you must also specify TrainingData. The project must not have any associated datasets.
        public let testingData: TestingData?
        /// Specifies an external manifest that the services uses to train the project version. If you specify TrainingData you must also specify TestingData. The project must not have any associated datasets.
        public let trainingData: TrainingData?
        /// A description applied to the project version being created.
        public let versionDescription: String?
        /// A name for the version of the project version. This value must be unique.
        public let versionName: String

        @inlinable
        public init(featureConfig: CustomizationFeatureConfig? = nil, kmsKeyId: String? = nil, outputConfig: OutputConfig, projectArn: String, tags: [String: String]? = nil, testingData: TestingData? = nil, trainingData: TrainingData? = nil, versionDescription: String? = nil, versionName: String) {
            self.featureConfig = featureConfig
            self.kmsKeyId = kmsKeyId
            self.outputConfig = outputConfig
            self.projectArn = projectArn
            self.tags = tags
            self.testingData = testingData
            self.trainingData = trainingData
            self.versionDescription = versionDescription
            self.versionName = versionName
        }

        public func validate(name: String) throws {
            try self.featureConfig?.validate(name: "\(name).featureConfig")
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, max: 2048)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, min: 1)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,2048}$")
            try self.outputConfig.validate(name: "\(name).outputConfig")
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
            try self.testingData?.validate(name: "\(name).testingData")
            try self.trainingData?.validate(name: "\(name).trainingData")
            try self.validate(self.versionDescription, name: "versionDescription", parent: name, max: 255)
            try self.validate(self.versionDescription, name: "versionDescription", parent: name, min: 1)
            try self.validate(self.versionDescription, name: "versionDescription", parent: name, pattern: "^[a-zA-Z0-9-_. ()':,;?]+$")
            try self.validate(self.versionName, name: "versionName", parent: name, max: 255)
            try self.validate(self.versionName, name: "versionName", parent: name, min: 1)
            try self.validate(self.versionName, name: "versionName", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case featureConfig = "FeatureConfig"
            case kmsKeyId = "KmsKeyId"
            case outputConfig = "OutputConfig"
            case projectArn = "ProjectArn"
            case tags = "Tags"
            case testingData = "TestingData"
            case trainingData = "TrainingData"
            case versionDescription = "VersionDescription"
            case versionName = "VersionName"
        }
    }

    public struct CreateProjectVersionResponse: AWSDecodableShape {
        /// The ARN of the model or the project version that was created. Use DescribeProjectVersion to get the current status of the training operation.
        public let projectVersionArn: String?

        @inlinable
        public init(projectVersionArn: String? = nil) {
            self.projectVersionArn = projectVersionArn
        }

        private enum CodingKeys: String, CodingKey {
            case projectVersionArn = "ProjectVersionArn"
        }
    }

    public struct CreateStreamProcessorRequest: AWSEncodableShape {
        ///  Shows whether you are sharing data with Rekognition to improve model performance. You can choose this option at the account level or on a per-stream basis. Note that if you opt out at the account level this setting is ignored on individual streams.
        public let dataSharingPreference: StreamProcessorDataSharingPreference?
        /// Kinesis video stream stream that provides the source streaming video. If you are using the AWS CLI, the parameter name is StreamProcessorInput. This is required for both face search and label detection stream processors.
        public let input: StreamProcessorInput
        ///  The identifier for your AWS Key Management Service key (AWS KMS key). This is an optional parameter for label detection stream processors and should not be used to create a face search stream processor. You can supply the Amazon Resource Name (ARN) of your KMS key, the ID of your KMS key, an alias for your KMS key, or an alias ARN.  The key is used to encrypt results and data published to your Amazon S3 bucket, which includes  image frames and hero images. Your source images are unaffected.
        public let kmsKeyId: String?
        /// An identifier you assign to the stream processor. You can use Name to manage the stream processor. For example, you can get the current status of the stream processor by calling DescribeStreamProcessor. Name is idempotent. This is required for both face search and label detection stream processors.
        public let name: String
        public let notificationChannel: StreamProcessorNotificationChannel?
        /// Kinesis data stream stream or Amazon S3 bucket location to which Amazon Rekognition Video puts the analysis results. If you are using the AWS CLI, the parameter name is StreamProcessorOutput.  This must be a S3Destination of an Amazon S3 bucket that you own for a label detection stream processor or a Kinesis data stream ARN for a face search stream processor.
        public let output: StreamProcessorOutput
        ///  Specifies locations in the frames where Amazon Rekognition checks for objects or people. You can specify up to 10 regions of interest, and each region has either a polygon or a bounding box. This is an optional parameter for label detection stream processors and should not be used to create a face search stream processor.
        public let regionsOfInterest: [RegionOfInterest]?
        /// The Amazon Resource Number (ARN) of the IAM role that allows access to the stream processor.  The IAM role provides Rekognition read permissions for a Kinesis stream.  It also provides write permissions to an Amazon S3 bucket and Amazon Simple Notification Service topic for a label detection stream processor. This is required for both face search and label detection stream processors.
        public let roleArn: String
        /// Input parameters used in a streaming video analyzed by a stream processor. You can use FaceSearch to recognize faces in a streaming video, or you can use ConnectedHome to detect labels.
        public let settings: StreamProcessorSettings
        ///  A set of tags (key-value pairs) that you want to attach to the stream processor.
        public let tags: [String: String]?

        @inlinable
        public init(dataSharingPreference: StreamProcessorDataSharingPreference? = nil, input: StreamProcessorInput, kmsKeyId: String? = nil, name: String, notificationChannel: StreamProcessorNotificationChannel? = nil, output: StreamProcessorOutput, regionsOfInterest: [RegionOfInterest]? = nil, roleArn: String, settings: StreamProcessorSettings, tags: [String: String]? = nil) {
            self.dataSharingPreference = dataSharingPreference
            self.input = input
            self.kmsKeyId = kmsKeyId
            self.name = name
            self.notificationChannel = notificationChannel
            self.output = output
            self.regionsOfInterest = regionsOfInterest
            self.roleArn = roleArn
            self.settings = settings
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.input.validate(name: "\(name).input")
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, max: 2048)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, min: 1)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,2048}$")
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.output.validate(name: "\(name).output")
            try self.validate(self.regionsOfInterest, name: "regionsOfInterest", parent: name, max: 10)
            try self.validate(self.roleArn, name: "roleArn", parent: name, pattern: "^arn:aws:iam::\\d{12}:role/?[a-zA-Z_0-9+=,.@\\-_/]+$")
            try self.settings.validate(name: "\(name).settings")
            try self.tags?.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case dataSharingPreference = "DataSharingPreference"
            case input = "Input"
            case kmsKeyId = "KmsKeyId"
            case name = "Name"
            case notificationChannel = "NotificationChannel"
            case output = "Output"
            case regionsOfInterest = "RegionsOfInterest"
            case roleArn = "RoleArn"
            case settings = "Settings"
            case tags = "Tags"
        }
    }

    public struct CreateStreamProcessorResponse: AWSDecodableShape {
        /// Amazon Resource Number for the newly created stream processor.
        public let streamProcessorArn: String?

        @inlinable
        public init(streamProcessorArn: String? = nil) {
            self.streamProcessorArn = streamProcessorArn
        }

        private enum CodingKeys: String, CodingKey {
            case streamProcessorArn = "StreamProcessorArn"
        }
    }

    public struct CreateUserRequest: AWSEncodableShape {
        /// Idempotent token used to identify the request to CreateUser. If you use the same token with multiple CreateUser requests, the same response is returned. Use ClientRequestToken to prevent the same request from being processed more than once.
        public let clientRequestToken: String?
        /// The ID of an existing collection to which the new UserID needs to be created.
        public let collectionId: String
        /// ID for the UserID to be created. This ID needs to be unique within the collection.
        public let userId: String

        @inlinable
        public init(clientRequestToken: String? = CreateUserRequest.idempotencyToken(), collectionId: String, userId: String) {
            self.clientRequestToken = clientRequestToken
            self.collectionId = collectionId
            self.userId = userId
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.userId, name: "userId", parent: name, max: 128)
            try self.validate(self.userId, name: "userId", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case collectionId = "CollectionId"
            case userId = "UserId"
        }
    }

    public struct CreateUserResponse: AWSDecodableShape {
        public init() {}
    }

    public struct CustomLabel: AWSDecodableShape {
        /// The confidence that the model has in the detection of the custom label. The  range is 0-100. A higher value indicates a higher confidence.
        public let confidence: Float?
        /// The location of the detected object on the image that corresponds to the custom label.  Includes an axis aligned coarse bounding box surrounding the object and a finer grain polygon for more accurate spatial information.
        public let geometry: Geometry?
        /// The name of the custom label.
        public let name: String?

        @inlinable
        public init(confidence: Float? = nil, geometry: Geometry? = nil, name: String? = nil) {
            self.confidence = confidence
            self.geometry = geometry
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case geometry = "Geometry"
            case name = "Name"
        }
    }

    public struct CustomizationFeatureConfig: AWSEncodableShape & AWSDecodableShape {
        /// Configuration options for Custom Moderation training.
        public let contentModeration: CustomizationFeatureContentModerationConfig?

        @inlinable
        public init(contentModeration: CustomizationFeatureContentModerationConfig? = nil) {
            self.contentModeration = contentModeration
        }

        public func validate(name: String) throws {
            try self.contentModeration?.validate(name: "\(name).contentModeration")
        }

        private enum CodingKeys: String, CodingKey {
            case contentModeration = "ContentModeration"
        }
    }

    public struct CustomizationFeatureContentModerationConfig: AWSEncodableShape & AWSDecodableShape {
        /// The confidence level you plan to use to identify if unsafe content is present during inference.
        public let confidenceThreshold: Float?

        @inlinable
        public init(confidenceThreshold: Float? = nil) {
            self.confidenceThreshold = confidenceThreshold
        }

        public func validate(name: String) throws {
            try self.validate(self.confidenceThreshold, name: "confidenceThreshold", parent: name, max: 100.0)
            try self.validate(self.confidenceThreshold, name: "confidenceThreshold", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case confidenceThreshold = "ConfidenceThreshold"
        }
    }

    public struct DatasetChanges: AWSEncodableShape {
        /// A Base64-encoded binary data object containing one or JSON lines that either update the dataset or are additions to the dataset.  You change a dataset by calling UpdateDatasetEntries. If you are using an AWS SDK to call UpdateDatasetEntries, you don't need to encode Changes as the SDK encodes the data for you.
        ///  For example JSON lines, see Image-Level labels in manifest files and  and Object localization in manifest files in the Amazon Rekognition Custom Labels Developer Guide.
        public let groundTruth: AWSBase64Data

        @inlinable
        public init(groundTruth: AWSBase64Data) {
            self.groundTruth = groundTruth
        }

        public func validate(name: String) throws {
            try self.validate(self.groundTruth, name: "groundTruth", parent: name, max: 5242880)
            try self.validate(self.groundTruth, name: "groundTruth", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case groundTruth = "GroundTruth"
        }
    }

    public struct DatasetDescription: AWSDecodableShape {
        /// The Unix timestamp for the time and date that the dataset was created.
        public let creationTimestamp: Date?
        /// The status message code for the dataset.
        public let datasetStats: DatasetStats?
        ///  The Unix timestamp for the date and time that the dataset was last updated.
        public let lastUpdatedTimestamp: Date?
        ///  The status of the dataset.
        public let status: DatasetStatus?
        ///  The status message for the dataset.
        public let statusMessage: String?
        ///  The status message code for the dataset operation. If a service error occurs, try the  API call again later. If a client error occurs, check the input parameters to the dataset API call that failed.
        public let statusMessageCode: DatasetStatusMessageCode?

        @inlinable
        public init(creationTimestamp: Date? = nil, datasetStats: DatasetStats? = nil, lastUpdatedTimestamp: Date? = nil, status: DatasetStatus? = nil, statusMessage: String? = nil, statusMessageCode: DatasetStatusMessageCode? = nil) {
            self.creationTimestamp = creationTimestamp
            self.datasetStats = datasetStats
            self.lastUpdatedTimestamp = lastUpdatedTimestamp
            self.status = status
            self.statusMessage = statusMessage
            self.statusMessageCode = statusMessageCode
        }

        private enum CodingKeys: String, CodingKey {
            case creationTimestamp = "CreationTimestamp"
            case datasetStats = "DatasetStats"
            case lastUpdatedTimestamp = "LastUpdatedTimestamp"
            case status = "Status"
            case statusMessage = "StatusMessage"
            case statusMessageCode = "StatusMessageCode"
        }
    }

    public struct DatasetLabelDescription: AWSDecodableShape {
        /// The name of the label.
        public let labelName: String?
        /// Statistics about the label.
        public let labelStats: DatasetLabelStats?

        @inlinable
        public init(labelName: String? = nil, labelStats: DatasetLabelStats? = nil) {
            self.labelName = labelName
            self.labelStats = labelStats
        }

        private enum CodingKeys: String, CodingKey {
            case labelName = "LabelName"
            case labelStats = "LabelStats"
        }
    }

    public struct DatasetLabelStats: AWSDecodableShape {
        /// The total number of images that have the label assigned to a bounding box.
        public let boundingBoxCount: Int?
        /// The total number of images that use the label.
        public let entryCount: Int?

        @inlinable
        public init(boundingBoxCount: Int? = nil, entryCount: Int? = nil) {
            self.boundingBoxCount = boundingBoxCount
            self.entryCount = entryCount
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBoxCount = "BoundingBoxCount"
            case entryCount = "EntryCount"
        }
    }

    public struct DatasetMetadata: AWSDecodableShape {
        ///  The Unix timestamp for the date and time that the dataset was created.
        public let creationTimestamp: Date?
        /// The Amazon Resource Name (ARN) for the dataset.
        public let datasetArn: String?
        ///  The type of the dataset.
        public let datasetType: DatasetType?
        ///  The status for the dataset.
        public let status: DatasetStatus?
        ///  The status message for the dataset.
        public let statusMessage: String?
        ///  The status message code for the dataset operation. If a service error occurs, try the  API call again later. If a client error occurs, check the input parameters to the dataset API call that failed.
        public let statusMessageCode: DatasetStatusMessageCode?

        @inlinable
        public init(creationTimestamp: Date? = nil, datasetArn: String? = nil, datasetType: DatasetType? = nil, status: DatasetStatus? = nil, statusMessage: String? = nil, statusMessageCode: DatasetStatusMessageCode? = nil) {
            self.creationTimestamp = creationTimestamp
            self.datasetArn = datasetArn
            self.datasetType = datasetType
            self.status = status
            self.statusMessage = statusMessage
            self.statusMessageCode = statusMessageCode
        }

        private enum CodingKeys: String, CodingKey {
            case creationTimestamp = "CreationTimestamp"
            case datasetArn = "DatasetArn"
            case datasetType = "DatasetType"
            case status = "Status"
            case statusMessage = "StatusMessage"
            case statusMessageCode = "StatusMessageCode"
        }
    }

    public struct DatasetSource: AWSEncodableShape {
        /// The ARN of an Amazon Rekognition Custom Labels dataset that you want to copy.
        public let datasetArn: String?
        public let groundTruthManifest: GroundTruthManifest?

        @inlinable
        public init(datasetArn: String? = nil, groundTruthManifest: GroundTruthManifest? = nil) {
            self.datasetArn = datasetArn
            self.groundTruthManifest = groundTruthManifest
        }

        public func validate(name: String) throws {
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, max: 2048)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, min: 20)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
            try self.groundTruthManifest?.validate(name: "\(name).groundTruthManifest")
        }

        private enum CodingKeys: String, CodingKey {
            case datasetArn = "DatasetArn"
            case groundTruthManifest = "GroundTruthManifest"
        }
    }

    public struct DatasetStats: AWSDecodableShape {
        ///  The total number of entries that contain at least one error.
        public let errorEntries: Int?
        /// The total number of images in the dataset that have labels.
        public let labeledEntries: Int?
        /// The total number of images in the dataset.
        public let totalEntries: Int?
        /// The total number of labels declared in the dataset.
        public let totalLabels: Int?

        @inlinable
        public init(errorEntries: Int? = nil, labeledEntries: Int? = nil, totalEntries: Int? = nil, totalLabels: Int? = nil) {
            self.errorEntries = errorEntries
            self.labeledEntries = labeledEntries
            self.totalEntries = totalEntries
            self.totalLabels = totalLabels
        }

        private enum CodingKeys: String, CodingKey {
            case errorEntries = "ErrorEntries"
            case labeledEntries = "LabeledEntries"
            case totalEntries = "TotalEntries"
            case totalLabels = "TotalLabels"
        }
    }

    public struct DeleteCollectionRequest: AWSEncodableShape {
        /// ID of the collection to delete.
        public let collectionId: String

        @inlinable
        public init(collectionId: String) {
            self.collectionId = collectionId
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
        }
    }

    public struct DeleteCollectionResponse: AWSDecodableShape {
        /// HTTP status code that indicates the result of the operation.
        public let statusCode: Int?

        @inlinable
        public init(statusCode: Int? = nil) {
            self.statusCode = statusCode
        }

        private enum CodingKeys: String, CodingKey {
            case statusCode = "StatusCode"
        }
    }

    public struct DeleteDatasetRequest: AWSEncodableShape {
        /// The ARN of the Amazon Rekognition Custom Labels dataset that you want to delete.
        public let datasetArn: String

        @inlinable
        public init(datasetArn: String) {
            self.datasetArn = datasetArn
        }

        public func validate(name: String) throws {
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, max: 2048)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, min: 20)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case datasetArn = "DatasetArn"
        }
    }

    public struct DeleteDatasetResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteFacesRequest: AWSEncodableShape {
        /// Collection from which to remove the specific faces.
        public let collectionId: String
        /// An array of face IDs to delete.
        public let faceIds: [String]

        @inlinable
        public init(collectionId: String, faceIds: [String]) {
            self.collectionId = collectionId
            self.faceIds = faceIds
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.faceIds.forEach {
                try validate($0, name: "faceIds[]", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
            }
            try self.validate(self.faceIds, name: "faceIds", parent: name, max: 4096)
            try self.validate(self.faceIds, name: "faceIds", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case faceIds = "FaceIds"
        }
    }

    public struct DeleteFacesResponse: AWSDecodableShape {
        /// An array of strings (face IDs) of the faces that were deleted.
        public let deletedFaces: [String]?
        /// An array of any faces that weren't deleted.
        public let unsuccessfulFaceDeletions: [UnsuccessfulFaceDeletion]?

        @inlinable
        public init(deletedFaces: [String]? = nil, unsuccessfulFaceDeletions: [UnsuccessfulFaceDeletion]? = nil) {
            self.deletedFaces = deletedFaces
            self.unsuccessfulFaceDeletions = unsuccessfulFaceDeletions
        }

        private enum CodingKeys: String, CodingKey {
            case deletedFaces = "DeletedFaces"
            case unsuccessfulFaceDeletions = "UnsuccessfulFaceDeletions"
        }
    }

    public struct DeleteProjectPolicyRequest: AWSEncodableShape {
        /// The name of the policy that you want to delete.
        public let policyName: String
        /// The ID of the project policy revision that you want to delete.
        public let policyRevisionId: String?
        /// The Amazon Resource Name (ARN) of the project that the project policy you want to delete is attached to.
        public let projectArn: String

        @inlinable
        public init(policyName: String, policyRevisionId: String? = nil, projectArn: String) {
            self.policyName = policyName
            self.policyRevisionId = policyRevisionId
            self.projectArn = projectArn
        }

        public func validate(name: String) throws {
            try self.validate(self.policyName, name: "policyName", parent: name, max: 128)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.policyRevisionId, name: "policyRevisionId", parent: name, max: 64)
            try self.validate(self.policyRevisionId, name: "policyRevisionId", parent: name, pattern: "^[0-9A-Fa-f]+$")
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case policyName = "PolicyName"
            case policyRevisionId = "PolicyRevisionId"
            case projectArn = "ProjectArn"
        }
    }

    public struct DeleteProjectPolicyResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteProjectRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the project that you want to delete.
        public let projectArn: String

        @inlinable
        public init(projectArn: String) {
            self.projectArn = projectArn
        }

        public func validate(name: String) throws {
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case projectArn = "ProjectArn"
        }
    }

    public struct DeleteProjectResponse: AWSDecodableShape {
        /// The current status of the delete project operation.
        public let status: ProjectStatus?

        @inlinable
        public init(status: ProjectStatus? = nil) {
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
        }
    }

    public struct DeleteProjectVersionRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the project version that you want to delete.
        public let projectVersionArn: String

        @inlinable
        public init(projectVersionArn: String) {
            self.projectVersionArn = projectVersionArn
        }

        public func validate(name: String) throws {
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, max: 2048)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, min: 20)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case projectVersionArn = "ProjectVersionArn"
        }
    }

    public struct DeleteProjectVersionResponse: AWSDecodableShape {
        /// The status of the deletion operation.
        public let status: ProjectVersionStatus?

        @inlinable
        public init(status: ProjectVersionStatus? = nil) {
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
        }
    }

    public struct DeleteStreamProcessorRequest: AWSEncodableShape {
        /// The name of the stream processor you want to delete.
        public let name: String

        @inlinable
        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct DeleteStreamProcessorResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DeleteUserRequest: AWSEncodableShape {
        /// Idempotent token used to identify the request to DeleteUser. If you use the same token with multiple DeleteUser requests, the same response is returned. Use ClientRequestToken to prevent the same request from being processed more than once.
        public let clientRequestToken: String?
        /// The ID of an existing collection from which the UserID needs to be deleted.
        public let collectionId: String
        /// ID for the UserID to be deleted.
        public let userId: String

        @inlinable
        public init(clientRequestToken: String? = DeleteUserRequest.idempotencyToken(), collectionId: String, userId: String) {
            self.clientRequestToken = clientRequestToken
            self.collectionId = collectionId
            self.userId = userId
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.userId, name: "userId", parent: name, max: 128)
            try self.validate(self.userId, name: "userId", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case collectionId = "CollectionId"
            case userId = "UserId"
        }
    }

    public struct DeleteUserResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DescribeCollectionRequest: AWSEncodableShape {
        /// The ID of the collection to describe.
        public let collectionId: String

        @inlinable
        public init(collectionId: String) {
            self.collectionId = collectionId
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
        }
    }

    public struct DescribeCollectionResponse: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the collection.
        public let collectionARN: String?
        /// The number of milliseconds since the Unix epoch time until the creation of the collection. The Unix epoch time is 00:00:00 Coordinated Universal Time (UTC), Thursday, 1 January 1970.
        public let creationTimestamp: Date?
        /// The number of faces that are indexed into the collection. To index faces into a collection, use IndexFaces.
        public let faceCount: Int64?
        /// The version of the face model that's used by the collection for face detection. For more information, see Model versioning in the  Amazon Rekognition Developer Guide.
        public let faceModelVersion: String?
        /// The number of UserIDs assigned to the specified colleciton.
        public let userCount: Int64?

        @inlinable
        public init(collectionARN: String? = nil, creationTimestamp: Date? = nil, faceCount: Int64? = nil, faceModelVersion: String? = nil, userCount: Int64? = nil) {
            self.collectionARN = collectionARN
            self.creationTimestamp = creationTimestamp
            self.faceCount = faceCount
            self.faceModelVersion = faceModelVersion
            self.userCount = userCount
        }

        private enum CodingKeys: String, CodingKey {
            case collectionARN = "CollectionARN"
            case creationTimestamp = "CreationTimestamp"
            case faceCount = "FaceCount"
            case faceModelVersion = "FaceModelVersion"
            case userCount = "UserCount"
        }
    }

    public struct DescribeDatasetRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the dataset that you want to describe.
        public let datasetArn: String

        @inlinable
        public init(datasetArn: String) {
            self.datasetArn = datasetArn
        }

        public func validate(name: String) throws {
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, max: 2048)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, min: 20)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case datasetArn = "DatasetArn"
        }
    }

    public struct DescribeDatasetResponse: AWSDecodableShape {
        /// The description for the dataset.
        public let datasetDescription: DatasetDescription?

        @inlinable
        public init(datasetDescription: DatasetDescription? = nil) {
            self.datasetDescription = datasetDescription
        }

        private enum CodingKeys: String, CodingKey {
            case datasetDescription = "DatasetDescription"
        }
    }

    public struct DescribeProjectVersionsRequest: AWSEncodableShape {
        /// The maximum number of results to return per paginated call.  The largest value you can specify is 100. If you specify a value greater than 100, a ValidationException error occurs. The default value is 100.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition returns a pagination token in the response.  You can use this pagination token to retrieve the next set of results.
        public let nextToken: String?
        /// The Amazon Resource Name (ARN) of the project that contains the model/adapter you want to describe.
        public let projectArn: String
        /// A list of model or project version names that you want to describe. You can add up to 10 model or project version names to the list. If you don't specify a value, all project version descriptions are returned. A version name is part of a project version ARN. For example, my-model.2020-01-21T09.10.15 is the version name in the following ARN. arn:aws:rekognition:us-east-1:123456789012:project/getting-started/version/my-model.2020-01-21T09.10.15/1234567890123.
        public let versionNames: [String]?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, projectArn: String, versionNames: [String]? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.projectArn = projectArn
            self.versionNames = versionNames
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 1024)
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
            try self.versionNames?.forEach {
                try validate($0, name: "versionNames[]", parent: name, max: 255)
                try validate($0, name: "versionNames[]", parent: name, min: 1)
                try validate($0, name: "versionNames[]", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            }
            try self.validate(self.versionNames, name: "versionNames", parent: name, max: 10)
            try self.validate(self.versionNames, name: "versionNames", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case projectArn = "ProjectArn"
            case versionNames = "VersionNames"
        }
    }

    public struct DescribeProjectVersionsResponse: AWSDecodableShape {
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition returns a pagination token in the response.  You can use this pagination token to retrieve the next set of results.
        public let nextToken: String?
        /// A list of project version descriptions. The list is sorted by the creation date and time of the project versions, latest to earliest.
        public let projectVersionDescriptions: [ProjectVersionDescription]?

        @inlinable
        public init(nextToken: String? = nil, projectVersionDescriptions: [ProjectVersionDescription]? = nil) {
            self.nextToken = nextToken
            self.projectVersionDescriptions = projectVersionDescriptions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case projectVersionDescriptions = "ProjectVersionDescriptions"
        }
    }

    public struct DescribeProjectsRequest: AWSEncodableShape {
        /// Specifies the type of customization to filter projects by. If no value is specified,  CUSTOM_LABELS is used as a default.
        public let features: [CustomizationFeature]?
        /// The maximum number of results to return per paginated call. The largest value you can specify is 100.  If you specify a value greater than 100, a ValidationException error occurs. The default value is 100.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more results to retrieve), Rekognition returns a pagination token in the response. You can use this pagination  token to retrieve the next set of results.
        public let nextToken: String?
        /// A list of the projects that you want Rekognition to describe. If you don't specify a value,  the response includes descriptions for all the projects in your AWS account.
        public let projectNames: [String]?

        @inlinable
        public init(features: [CustomizationFeature]? = nil, maxResults: Int? = nil, nextToken: String? = nil, projectNames: [String]? = nil) {
            self.features = features
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.projectNames = projectNames
        }

        public func validate(name: String) throws {
            try self.validate(self.features, name: "features", parent: name, max: 2)
            try self.validate(self.features, name: "features", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 1024)
            try self.projectNames?.forEach {
                try validate($0, name: "projectNames[]", parent: name, max: 255)
                try validate($0, name: "projectNames[]", parent: name, min: 1)
                try validate($0, name: "projectNames[]", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            }
            try self.validate(self.projectNames, name: "projectNames", parent: name, max: 10)
            try self.validate(self.projectNames, name: "projectNames", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case features = "Features"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case projectNames = "ProjectNames"
        }
    }

    public struct DescribeProjectsResponse: AWSDecodableShape {
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition returns a pagination token in the response.  You can use this pagination token to retrieve the next set of results.
        public let nextToken: String?
        /// A list of project descriptions. The list is sorted by the date and time the projects are created.
        public let projectDescriptions: [ProjectDescription]?

        @inlinable
        public init(nextToken: String? = nil, projectDescriptions: [ProjectDescription]? = nil) {
            self.nextToken = nextToken
            self.projectDescriptions = projectDescriptions
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case projectDescriptions = "ProjectDescriptions"
        }
    }

    public struct DescribeStreamProcessorRequest: AWSEncodableShape {
        /// Name of the stream processor for which you want information.
        public let name: String

        @inlinable
        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct DescribeStreamProcessorResponse: AWSDecodableShape {
        /// Date and time the stream processor was created
        public let creationTimestamp: Date?
        ///  Shows whether you are sharing data with Rekognition to improve model performance. You can choose this option at the account level or on a per-stream basis. Note that if you opt out at the account level this setting is ignored on individual streams.
        public let dataSharingPreference: StreamProcessorDataSharingPreference?
        /// Kinesis video stream that provides the source streaming video.
        public let input: StreamProcessorInput?
        ///  The identifier for your AWS Key Management Service key (AWS KMS key). This is an optional parameter for label detection stream processors.
        public let kmsKeyId: String?
        /// The time, in Unix format, the stream processor was last updated. For example, when the stream processor moves from a running state to a failed state, or when the user starts or stops the stream processor.
        public let lastUpdateTimestamp: Date?
        /// Name of the stream processor.
        public let name: String?
        public let notificationChannel: StreamProcessorNotificationChannel?
        /// Kinesis data stream to which Amazon Rekognition Video puts the analysis results.
        public let output: StreamProcessorOutput?
        ///  Specifies locations in the frames where Amazon Rekognition checks for objects or people. This is an optional parameter for label detection stream processors.
        public let regionsOfInterest: [RegionOfInterest]?
        /// ARN of the IAM role that allows access to the stream processor.
        public let roleArn: String?
        /// Input parameters used in a streaming video analyzed by a stream processor. You can use FaceSearch to recognize faces in a streaming video, or you can use ConnectedHome to detect labels.
        public let settings: StreamProcessorSettings?
        /// Current status of the stream processor.
        public let status: StreamProcessorStatus?
        /// Detailed status message about the stream processor.
        public let statusMessage: String?
        /// ARN of the stream processor.
        public let streamProcessorArn: String?

        @inlinable
        public init(creationTimestamp: Date? = nil, dataSharingPreference: StreamProcessorDataSharingPreference? = nil, input: StreamProcessorInput? = nil, kmsKeyId: String? = nil, lastUpdateTimestamp: Date? = nil, name: String? = nil, notificationChannel: StreamProcessorNotificationChannel? = nil, output: StreamProcessorOutput? = nil, regionsOfInterest: [RegionOfInterest]? = nil, roleArn: String? = nil, settings: StreamProcessorSettings? = nil, status: StreamProcessorStatus? = nil, statusMessage: String? = nil, streamProcessorArn: String? = nil) {
            self.creationTimestamp = creationTimestamp
            self.dataSharingPreference = dataSharingPreference
            self.input = input
            self.kmsKeyId = kmsKeyId
            self.lastUpdateTimestamp = lastUpdateTimestamp
            self.name = name
            self.notificationChannel = notificationChannel
            self.output = output
            self.regionsOfInterest = regionsOfInterest
            self.roleArn = roleArn
            self.settings = settings
            self.status = status
            self.statusMessage = statusMessage
            self.streamProcessorArn = streamProcessorArn
        }

        private enum CodingKeys: String, CodingKey {
            case creationTimestamp = "CreationTimestamp"
            case dataSharingPreference = "DataSharingPreference"
            case input = "Input"
            case kmsKeyId = "KmsKeyId"
            case lastUpdateTimestamp = "LastUpdateTimestamp"
            case name = "Name"
            case notificationChannel = "NotificationChannel"
            case output = "Output"
            case regionsOfInterest = "RegionsOfInterest"
            case roleArn = "RoleArn"
            case settings = "Settings"
            case status = "Status"
            case statusMessage = "StatusMessage"
            case streamProcessorArn = "StreamProcessorArn"
        }
    }

    public struct DetectCustomLabelsRequest: AWSEncodableShape {
        public let image: Image
        /// Maximum number of results you want the service to return in the response.  The service returns the specified number of highest confidence labels ranked from highest confidence  to lowest.
        public let maxResults: Int?
        /// Specifies the minimum confidence level for the labels to return.  DetectCustomLabels doesn't return any labels with a confidence value that's lower than this specified value. If you specify a value of 0, DetectCustomLabels returns all labels, regardless of the assumed  threshold applied to each label. If you don't specify a value for MinConfidence,  DetectCustomLabels returns labels based on the assumed threshold of each label.
        public let minConfidence: Float?
        /// The ARN of the model version that you want to use. Only models associated with Custom Labels projects accepted by the operation. If a provided ARN refers to a model version associated with a project for a different feature type, then an InvalidParameterException is returned.
        public let projectVersionArn: String

        @inlinable
        public init(image: Image, maxResults: Int? = nil, minConfidence: Float? = nil, projectVersionArn: String) {
            self.image = image
            self.maxResults = maxResults
            self.minConfidence = minConfidence
            self.projectVersionArn = projectVersionArn
        }

        public func validate(name: String) throws {
            try self.image.validate(name: "\(name).image")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, max: 2048)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, min: 20)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case image = "Image"
            case maxResults = "MaxResults"
            case minConfidence = "MinConfidence"
            case projectVersionArn = "ProjectVersionArn"
        }
    }

    public struct DetectCustomLabelsResponse: AWSDecodableShape {
        /// An array of custom labels detected in the input image.
        public let customLabels: [CustomLabel]?

        @inlinable
        public init(customLabels: [CustomLabel]? = nil) {
            self.customLabels = customLabels
        }

        private enum CodingKeys: String, CodingKey {
            case customLabels = "CustomLabels"
        }
    }

    public struct DetectFacesRequest: AWSEncodableShape {
        /// An array of facial attributes you want to be returned. A DEFAULT subset of facial attributes - BoundingBox, Confidence, Pose, Quality, and Landmarks - will always be returned. You can request for specific facial attributes (in addition to the default list) - by using ["DEFAULT", "FACE_OCCLUDED"] or just ["FACE_OCCLUDED"]. You can request for all facial attributes by using ["ALL"]. Requesting more attributes may increase response time. If you provide both, ["ALL", "DEFAULT"], the service uses a logical "AND" operator to determine which attributes to return (in this case, all attributes).  Note that while the FaceOccluded and EyeDirection attributes are supported when using DetectFaces, they aren't supported when analyzing videos with StartFaceDetection and GetFaceDetection.
        public let attributes: [Attribute]?
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes is not supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image

        @inlinable
        public init(attributes: [Attribute]? = nil, image: Image) {
            self.attributes = attributes
            self.image = image
        }

        public func validate(name: String) throws {
            try self.image.validate(name: "\(name).image")
        }

        private enum CodingKeys: String, CodingKey {
            case attributes = "Attributes"
            case image = "Image"
        }
    }

    public struct DetectFacesResponse: AWSDecodableShape {
        /// Details of each face found in the image.
        public let faceDetails: [FaceDetail]?
        /// The value of OrientationCorrection is always null. If the input image is in .jpeg format, it might contain exchangeable image file format (Exif) metadata that includes the image's orientation. Amazon Rekognition uses this orientation information to perform image correction. The bounding box coordinates are translated to represent object locations after the orientation information in the Exif metadata is used to correct the image orientation. Images in .png format don't contain Exif metadata. Amazon Rekognition doesn’t perform image correction for images in .png format and .jpeg images without orientation information in the image Exif metadata. The bounding box coordinates aren't translated and represent the object locations before the image is rotated.
        public let orientationCorrection: OrientationCorrection?

        @inlinable
        public init(faceDetails: [FaceDetail]? = nil, orientationCorrection: OrientationCorrection? = nil) {
            self.faceDetails = faceDetails
            self.orientationCorrection = orientationCorrection
        }

        private enum CodingKeys: String, CodingKey {
            case faceDetails = "FaceDetails"
            case orientationCorrection = "OrientationCorrection"
        }
    }

    public struct DetectLabelsImageBackground: AWSDecodableShape {
        /// The dominant colors found in the background of an image, defined with RGB values, CSS color name, simplified color name, and PixelPercentage (the percentage of image pixels that have a particular color).
        public let dominantColors: [DominantColor]?
        /// The quality of the image background as defined by brightness and sharpness.
        public let quality: DetectLabelsImageQuality?

        @inlinable
        public init(dominantColors: [DominantColor]? = nil, quality: DetectLabelsImageQuality? = nil) {
            self.dominantColors = dominantColors
            self.quality = quality
        }

        private enum CodingKeys: String, CodingKey {
            case dominantColors = "DominantColors"
            case quality = "Quality"
        }
    }

    public struct DetectLabelsImageForeground: AWSDecodableShape {
        /// The dominant colors found in the foreground of an image, defined with RGB values, CSS color name, simplified color name, and PixelPercentage (the percentage of image pixels that have a particular color).
        public let dominantColors: [DominantColor]?
        /// The quality of the image foreground as defined by brightness and sharpness.
        public let quality: DetectLabelsImageQuality?

        @inlinable
        public init(dominantColors: [DominantColor]? = nil, quality: DetectLabelsImageQuality? = nil) {
            self.dominantColors = dominantColors
            self.quality = quality
        }

        private enum CodingKeys: String, CodingKey {
            case dominantColors = "DominantColors"
            case quality = "Quality"
        }
    }

    public struct DetectLabelsImageProperties: AWSDecodableShape {
        /// Information about the properties of an image’s background, including the background’s quality and dominant colors, including the quality and dominant colors of the image.
        public let background: DetectLabelsImageBackground?
        /// Information about the dominant colors found in an image, described with RGB values, CSS color name, simplified color name, and PixelPercentage (the percentage of image pixels that have a particular color).
        public let dominantColors: [DominantColor]?
        /// Information about the properties of an image’s foreground, including the foreground’s quality and dominant colors, including the quality and dominant colors of the image.
        public let foreground: DetectLabelsImageForeground?
        /// Information about the quality of the image foreground as defined by brightness, sharpness, and contrast. The higher the value the greater the brightness, sharpness, and contrast respectively.
        public let quality: DetectLabelsImageQuality?

        @inlinable
        public init(background: DetectLabelsImageBackground? = nil, dominantColors: [DominantColor]? = nil, foreground: DetectLabelsImageForeground? = nil, quality: DetectLabelsImageQuality? = nil) {
            self.background = background
            self.dominantColors = dominantColors
            self.foreground = foreground
            self.quality = quality
        }

        private enum CodingKeys: String, CodingKey {
            case background = "Background"
            case dominantColors = "DominantColors"
            case foreground = "Foreground"
            case quality = "Quality"
        }
    }

    public struct DetectLabelsImagePropertiesSettings: AWSEncodableShape {
        /// The maximum number of dominant colors to return when detecting labels in an image. The default value is 10.
        public let maxDominantColors: Int?

        @inlinable
        public init(maxDominantColors: Int? = nil) {
            self.maxDominantColors = maxDominantColors
        }

        public func validate(name: String) throws {
            try self.validate(self.maxDominantColors, name: "maxDominantColors", parent: name, max: 20)
            try self.validate(self.maxDominantColors, name: "maxDominantColors", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case maxDominantColors = "MaxDominantColors"
        }
    }

    public struct DetectLabelsImageQuality: AWSDecodableShape {
        /// The brightness of an image provided for label detection.
        public let brightness: Float?
        /// The contrast of an image provided for label detection.
        public let contrast: Float?
        /// The sharpness of an image provided for label detection.
        public let sharpness: Float?

        @inlinable
        public init(brightness: Float? = nil, contrast: Float? = nil, sharpness: Float? = nil) {
            self.brightness = brightness
            self.contrast = contrast
            self.sharpness = sharpness
        }

        private enum CodingKeys: String, CodingKey {
            case brightness = "Brightness"
            case contrast = "Contrast"
            case sharpness = "Sharpness"
        }
    }

    public struct DetectLabelsRequest: AWSEncodableShape {
        /// A list of the types of analysis to perform. Specifying GENERAL_LABELS uses the label detection feature, while specifying IMAGE_PROPERTIES returns information regarding image color and quality. If no option is specified GENERAL_LABELS is used by default.
        public let features: [DetectLabelsFeatureName]?
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing image bytes is not supported. Images stored in an S3 Bucket do not need to be base64-encoded. If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image
        /// Maximum number of labels you want the service to return in the response. The service returns the specified number of highest confidence labels. Only valid when GENERAL_LABELS is specified as a feature type in the Feature input parameter.
        public let maxLabels: Int?
        /// Specifies the minimum confidence level for the labels to return. Amazon Rekognition doesn't return any labels with confidence lower than this specified value. If MinConfidence is not specified, the operation returns labels with a confidence values greater than or equal to 55 percent. Only valid when GENERAL_LABELS is specified as a feature type in the Feature input parameter.
        public let minConfidence: Float?
        /// A list of the filters to be applied to returned detected labels and image properties. Specified filters can be inclusive, exclusive, or a combination of both. Filters can be used for individual labels or label categories. The exact label names or label categories must be supplied. For a full list of labels and label categories, see Detecting labels.
        public let settings: DetectLabelsSettings?

        @inlinable
        public init(features: [DetectLabelsFeatureName]? = nil, image: Image, maxLabels: Int? = nil, minConfidence: Float? = nil, settings: DetectLabelsSettings? = nil) {
            self.features = features
            self.image = image
            self.maxLabels = maxLabels
            self.minConfidence = minConfidence
            self.settings = settings
        }

        public func validate(name: String) throws {
            try self.validate(self.features, name: "features", parent: name, max: 2)
            try self.image.validate(name: "\(name).image")
            try self.validate(self.maxLabels, name: "maxLabels", parent: name, min: 0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
            try self.settings?.validate(name: "\(name).settings")
        }

        private enum CodingKeys: String, CodingKey {
            case features = "Features"
            case image = "Image"
            case maxLabels = "MaxLabels"
            case minConfidence = "MinConfidence"
            case settings = "Settings"
        }
    }

    public struct DetectLabelsResponse: AWSDecodableShape {
        /// Information about the properties of the input image, such as brightness, sharpness, contrast, and dominant colors.
        public let imageProperties: DetectLabelsImageProperties?
        /// Version number of the label detection model that was used to detect labels.
        public let labelModelVersion: String?
        /// An array of labels for the real-world objects detected.
        public let labels: [Label]?
        /// The value of OrientationCorrection is always null. If the input image is in .jpeg format, it might contain exchangeable image file format (Exif) metadata that includes the image's orientation. Amazon Rekognition uses this orientation information to perform image correction. The bounding box coordinates are translated to represent object locations after the orientation information in the Exif metadata is used to correct the image orientation. Images in .png format don't contain Exif metadata. Amazon Rekognition doesn’t perform image correction for images in .png format and .jpeg images without orientation information in the image Exif metadata. The bounding box coordinates aren't translated and represent the object locations before the image is rotated.
        public let orientationCorrection: OrientationCorrection?

        @inlinable
        public init(imageProperties: DetectLabelsImageProperties? = nil, labelModelVersion: String? = nil, labels: [Label]? = nil, orientationCorrection: OrientationCorrection? = nil) {
            self.imageProperties = imageProperties
            self.labelModelVersion = labelModelVersion
            self.labels = labels
            self.orientationCorrection = orientationCorrection
        }

        private enum CodingKeys: String, CodingKey {
            case imageProperties = "ImageProperties"
            case labelModelVersion = "LabelModelVersion"
            case labels = "Labels"
            case orientationCorrection = "OrientationCorrection"
        }
    }

    public struct DetectLabelsSettings: AWSEncodableShape {
        /// Contains the specified filters for GENERAL_LABELS.
        public let generalLabels: GeneralLabelsSettings?
        /// Contains the chosen number of maximum dominant colors in an image.
        public let imageProperties: DetectLabelsImagePropertiesSettings?

        @inlinable
        public init(generalLabels: GeneralLabelsSettings? = nil, imageProperties: DetectLabelsImagePropertiesSettings? = nil) {
            self.generalLabels = generalLabels
            self.imageProperties = imageProperties
        }

        public func validate(name: String) throws {
            try self.generalLabels?.validate(name: "\(name).generalLabels")
            try self.imageProperties?.validate(name: "\(name).imageProperties")
        }

        private enum CodingKeys: String, CodingKey {
            case generalLabels = "GeneralLabels"
            case imageProperties = "ImageProperties"
        }
    }

    public struct DetectModerationLabelsRequest: AWSEncodableShape {
        /// Sets up the configuration for human evaluation, including the FlowDefinition the image will be sent to.
        public let humanLoopConfig: HumanLoopConfig?
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes is not supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image
        /// Specifies the minimum confidence level for the labels to return. Amazon Rekognition doesn't return any labels with a confidence level lower than this specified value. If you don't specify MinConfidence, the operation returns labels with confidence values greater than or equal to 50 percent.
        public let minConfidence: Float?
        /// Identifier for the custom adapter. Expects the ProjectVersionArn as a value.  Use the CreateProject or CreateProjectVersion APIs to create a custom adapter.
        public let projectVersion: String?

        @inlinable
        public init(humanLoopConfig: HumanLoopConfig? = nil, image: Image, minConfidence: Float? = nil, projectVersion: String? = nil) {
            self.humanLoopConfig = humanLoopConfig
            self.image = image
            self.minConfidence = minConfidence
            self.projectVersion = projectVersion
        }

        public func validate(name: String) throws {
            try self.humanLoopConfig?.validate(name: "\(name).humanLoopConfig")
            try self.image.validate(name: "\(name).image")
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
            try self.validate(self.projectVersion, name: "projectVersion", parent: name, max: 2048)
            try self.validate(self.projectVersion, name: "projectVersion", parent: name, min: 20)
            try self.validate(self.projectVersion, name: "projectVersion", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case humanLoopConfig = "HumanLoopConfig"
            case image = "Image"
            case minConfidence = "MinConfidence"
            case projectVersion = "ProjectVersion"
        }
    }

    public struct DetectModerationLabelsResponse: AWSDecodableShape {
        /// A list of predicted results for the type of content an image contains. For example,  the image content might be from animation, sports, or a video game.
        public let contentTypes: [ContentType]?
        /// Shows the results of the human in the loop evaluation.
        public let humanLoopActivationOutput: HumanLoopActivationOutput?
        /// Array of detected Moderation labels. For video operations, this includes the time,  in milliseconds from the start of the video, they were detected.
        public let moderationLabels: [ModerationLabel]?
        /// Version number of the base moderation detection model that was used to detect unsafe content.
        public let moderationModelVersion: String?
        /// Identifier of the custom adapter that was used during inference. If during inference the adapter was EXPIRED, then the parameter will not be returned, indicating that a base moderation detection project version was used.
        public let projectVersion: String?

        @inlinable
        public init(contentTypes: [ContentType]? = nil, humanLoopActivationOutput: HumanLoopActivationOutput? = nil, moderationLabels: [ModerationLabel]? = nil, moderationModelVersion: String? = nil, projectVersion: String? = nil) {
            self.contentTypes = contentTypes
            self.humanLoopActivationOutput = humanLoopActivationOutput
            self.moderationLabels = moderationLabels
            self.moderationModelVersion = moderationModelVersion
            self.projectVersion = projectVersion
        }

        private enum CodingKeys: String, CodingKey {
            case contentTypes = "ContentTypes"
            case humanLoopActivationOutput = "HumanLoopActivationOutput"
            case moderationLabels = "ModerationLabels"
            case moderationModelVersion = "ModerationModelVersion"
            case projectVersion = "ProjectVersion"
        }
    }

    public struct DetectProtectiveEquipmentRequest: AWSEncodableShape {
        /// The image in which you want to detect PPE on detected persons. The image can be passed as image bytes or you can  reference an image stored in an Amazon S3 bucket.
        public let image: Image
        /// An array of PPE types that you want to summarize.
        public let summarizationAttributes: ProtectiveEquipmentSummarizationAttributes?

        @inlinable
        public init(image: Image, summarizationAttributes: ProtectiveEquipmentSummarizationAttributes? = nil) {
            self.image = image
            self.summarizationAttributes = summarizationAttributes
        }

        public func validate(name: String) throws {
            try self.image.validate(name: "\(name).image")
            try self.summarizationAttributes?.validate(name: "\(name).summarizationAttributes")
        }

        private enum CodingKeys: String, CodingKey {
            case image = "Image"
            case summarizationAttributes = "SummarizationAttributes"
        }
    }

    public struct DetectProtectiveEquipmentResponse: AWSDecodableShape {
        /// An array of persons detected in the image (including persons not wearing PPE).
        public let persons: [ProtectiveEquipmentPerson]?
        /// The version number of the PPE detection model used to detect PPE in the image.
        public let protectiveEquipmentModelVersion: String?
        /// Summary information for the types of PPE specified in the SummarizationAttributes input parameter.
        public let summary: ProtectiveEquipmentSummary?

        @inlinable
        public init(persons: [ProtectiveEquipmentPerson]? = nil, protectiveEquipmentModelVersion: String? = nil, summary: ProtectiveEquipmentSummary? = nil) {
            self.persons = persons
            self.protectiveEquipmentModelVersion = protectiveEquipmentModelVersion
            self.summary = summary
        }

        private enum CodingKeys: String, CodingKey {
            case persons = "Persons"
            case protectiveEquipmentModelVersion = "ProtectiveEquipmentModelVersion"
            case summary = "Summary"
        }
    }

    public struct DetectTextFilters: AWSEncodableShape {
        ///  A Filter focusing on a certain area of the image. Uses a BoundingBox object to set the region of the image.
        public let regionsOfInterest: [RegionOfInterest]?
        public let wordFilter: DetectionFilter?

        @inlinable
        public init(regionsOfInterest: [RegionOfInterest]? = nil, wordFilter: DetectionFilter? = nil) {
            self.regionsOfInterest = regionsOfInterest
            self.wordFilter = wordFilter
        }

        public func validate(name: String) throws {
            try self.validate(self.regionsOfInterest, name: "regionsOfInterest", parent: name, max: 10)
            try self.wordFilter?.validate(name: "\(name).wordFilter")
        }

        private enum CodingKeys: String, CodingKey {
            case regionsOfInterest = "RegionsOfInterest"
            case wordFilter = "WordFilter"
        }
    }

    public struct DetectTextRequest: AWSEncodableShape {
        /// Optional parameters that let you set the criteria that the text must meet to be included in your response.
        public let filters: DetectTextFilters?
        /// The input image as base64-encoded bytes or an Amazon S3 object. If you use the AWS CLI to call Amazon Rekognition operations, you can't pass image bytes.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image

        @inlinable
        public init(filters: DetectTextFilters? = nil, image: Image) {
            self.filters = filters
            self.image = image
        }

        public func validate(name: String) throws {
            try self.filters?.validate(name: "\(name).filters")
            try self.image.validate(name: "\(name).image")
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case image = "Image"
        }
    }

    public struct DetectTextResponse: AWSDecodableShape {
        /// An array of text that was detected in the input image.
        public let textDetections: [TextDetection]?
        /// The model version used to detect text.
        public let textModelVersion: String?

        @inlinable
        public init(textDetections: [TextDetection]? = nil, textModelVersion: String? = nil) {
            self.textDetections = textDetections
            self.textModelVersion = textModelVersion
        }

        private enum CodingKeys: String, CodingKey {
            case textDetections = "TextDetections"
            case textModelVersion = "TextModelVersion"
        }
    }

    public struct DetectionFilter: AWSEncodableShape {
        /// Sets the minimum height of the word bounding box. Words with bounding box heights lesser than  this value will be excluded from the result. Value is relative to the video frame height.
        public let minBoundingBoxHeight: Float?
        /// Sets the minimum width of the word bounding box. Words with bounding boxes widths lesser than  this value will be excluded from the result. Value is relative to the video frame width.
        public let minBoundingBoxWidth: Float?
        /// Sets the confidence of word detection. Words with detection confidence below this will be excluded from the result. Values should be between 0 and 100. The default MinConfidence is 80.
        public let minConfidence: Float?

        @inlinable
        public init(minBoundingBoxHeight: Float? = nil, minBoundingBoxWidth: Float? = nil, minConfidence: Float? = nil) {
            self.minBoundingBoxHeight = minBoundingBoxHeight
            self.minBoundingBoxWidth = minBoundingBoxWidth
            self.minConfidence = minConfidence
        }

        public func validate(name: String) throws {
            try self.validate(self.minBoundingBoxHeight, name: "minBoundingBoxHeight", parent: name, max: 1.0)
            try self.validate(self.minBoundingBoxHeight, name: "minBoundingBoxHeight", parent: name, min: 0.0)
            try self.validate(self.minBoundingBoxWidth, name: "minBoundingBoxWidth", parent: name, max: 1.0)
            try self.validate(self.minBoundingBoxWidth, name: "minBoundingBoxWidth", parent: name, min: 0.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case minBoundingBoxHeight = "MinBoundingBoxHeight"
            case minBoundingBoxWidth = "MinBoundingBoxWidth"
            case minConfidence = "MinConfidence"
        }
    }

    public struct DisassociateFacesRequest: AWSEncodableShape {
        /// Idempotent token used to identify the request to DisassociateFaces. If you use the same token with multiple DisassociateFaces requests, the same response is returned. Use ClientRequestToken to prevent the same request from being processed more than once.
        public let clientRequestToken: String?
        /// The ID of an existing collection containing the UserID.
        public let collectionId: String
        /// An array of face IDs to disassociate from the UserID.
        public let faceIds: [String]
        /// ID for the existing UserID.
        public let userId: String

        @inlinable
        public init(clientRequestToken: String? = DisassociateFacesRequest.idempotencyToken(), collectionId: String, faceIds: [String], userId: String) {
            self.clientRequestToken = clientRequestToken
            self.collectionId = collectionId
            self.faceIds = faceIds
            self.userId = userId
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.faceIds.forEach {
                try validate($0, name: "faceIds[]", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
            }
            try self.validate(self.faceIds, name: "faceIds", parent: name, max: 100)
            try self.validate(self.faceIds, name: "faceIds", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, max: 128)
            try self.validate(self.userId, name: "userId", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case collectionId = "CollectionId"
            case faceIds = "FaceIds"
            case userId = "UserId"
        }
    }

    public struct DisassociateFacesResponse: AWSDecodableShape {
        /// An array of DissociatedFace objects containing FaceIds that are successfully disassociated with the UserID is returned. Returned if the DisassociatedFaces action is successful.
        public let disassociatedFaces: [DisassociatedFace]?
        /// An array of UnsuccessfulDisassociation objects containing FaceIds that are not successfully associated, along with the reasons for the failure to associate. Returned if the DisassociateFaces action is successful.
        public let unsuccessfulFaceDisassociations: [UnsuccessfulFaceDisassociation]?
        /// The status of an update made to a User. Reflects if the User has been updated for every requested change.
        public let userStatus: UserStatus?

        @inlinable
        public init(disassociatedFaces: [DisassociatedFace]? = nil, unsuccessfulFaceDisassociations: [UnsuccessfulFaceDisassociation]? = nil, userStatus: UserStatus? = nil) {
            self.disassociatedFaces = disassociatedFaces
            self.unsuccessfulFaceDisassociations = unsuccessfulFaceDisassociations
            self.userStatus = userStatus
        }

        private enum CodingKeys: String, CodingKey {
            case disassociatedFaces = "DisassociatedFaces"
            case unsuccessfulFaceDisassociations = "UnsuccessfulFaceDisassociations"
            case userStatus = "UserStatus"
        }
    }

    public struct DisassociatedFace: AWSDecodableShape {
        /// Unique identifier assigned to the face.
        public let faceId: String?

        @inlinable
        public init(faceId: String? = nil) {
            self.faceId = faceId
        }

        private enum CodingKeys: String, CodingKey {
            case faceId = "FaceId"
        }
    }

    public struct DistributeDataset: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the dataset that you want to use.
        public let arn: String

        @inlinable
        public init(arn: String) {
            self.arn = arn
        }

        public func validate(name: String) throws {
            try self.validate(self.arn, name: "arn", parent: name, max: 2048)
            try self.validate(self.arn, name: "arn", parent: name, min: 20)
            try self.validate(self.arn, name: "arn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct DistributeDatasetEntriesRequest: AWSEncodableShape {
        /// The ARNS for the training dataset and test dataset that you want to use. The datasets must belong to the same project. The test dataset must be empty.
        public let datasets: [DistributeDataset]

        @inlinable
        public init(datasets: [DistributeDataset]) {
            self.datasets = datasets
        }

        public func validate(name: String) throws {
            try self.datasets.forEach {
                try $0.validate(name: "\(name).datasets[]")
            }
            try self.validate(self.datasets, name: "datasets", parent: name, max: 2)
            try self.validate(self.datasets, name: "datasets", parent: name, min: 2)
        }

        private enum CodingKeys: String, CodingKey {
            case datasets = "Datasets"
        }
    }

    public struct DistributeDatasetEntriesResponse: AWSDecodableShape {
        public init() {}
    }

    public struct DominantColor: AWSDecodableShape {
        /// The Blue RGB value for a dominant color.
        public let blue: Int?
        /// The CSS color name of a dominant color.
        public let cssColor: String?
        /// The Green RGB value for a dominant color.
        public let green: Int?
        /// The Hex code equivalent of the RGB values for a dominant color.
        public let hexCode: String?
        /// The percentage of image pixels that have a given dominant color.
        public let pixelPercent: Float?
        /// The Red RGB value for a dominant color.
        public let red: Int?
        /// One of 12 simplified color names applied to a dominant color.
        public let simplifiedColor: String?

        @inlinable
        public init(blue: Int? = nil, cssColor: String? = nil, green: Int? = nil, hexCode: String? = nil, pixelPercent: Float? = nil, red: Int? = nil, simplifiedColor: String? = nil) {
            self.blue = blue
            self.cssColor = cssColor
            self.green = green
            self.hexCode = hexCode
            self.pixelPercent = pixelPercent
            self.red = red
            self.simplifiedColor = simplifiedColor
        }

        private enum CodingKeys: String, CodingKey {
            case blue = "Blue"
            case cssColor = "CSSColor"
            case green = "Green"
            case hexCode = "HexCode"
            case pixelPercent = "PixelPercent"
            case red = "Red"
            case simplifiedColor = "SimplifiedColor"
        }
    }

    public struct Emotion: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Type of emotion detected.
        public let type: EmotionName?

        @inlinable
        public init(confidence: Float? = nil, type: EmotionName? = nil) {
            self.confidence = confidence
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case type = "Type"
        }
    }

    public struct EquipmentDetection: AWSDecodableShape {
        /// A bounding box surrounding the item of detected PPE.
        public let boundingBox: BoundingBox?
        /// The confidence that Amazon Rekognition has that the bounding box (BoundingBox) contains an item of PPE.
        public let confidence: Float?
        /// Information about the body part covered by the detected PPE.
        public let coversBodyPart: CoversBodyPart?
        /// The type of detected PPE.
        public let type: ProtectiveEquipmentType?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, confidence: Float? = nil, coversBodyPart: CoversBodyPart? = nil, type: ProtectiveEquipmentType? = nil) {
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.coversBodyPart = coversBodyPart
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case coversBodyPart = "CoversBodyPart"
            case type = "Type"
        }
    }

    public struct EvaluationResult: AWSDecodableShape {
        /// The F1 score for the evaluation of all labels. The F1 score metric evaluates the overall precision and recall performance of the model as a single value. A higher value indicates better precision and recall performance. A lower score indicates that precision, recall, or both are performing poorly.
        public let f1Score: Float?
        /// The S3 bucket that contains the training summary.
        public let summary: Summary?

        @inlinable
        public init(f1Score: Float? = nil, summary: Summary? = nil) {
            self.f1Score = f1Score
            self.summary = summary
        }

        private enum CodingKeys: String, CodingKey {
            case f1Score = "F1Score"
            case summary = "Summary"
        }
    }

    public struct EyeDirection: AWSDecodableShape {
        /// The confidence that the service has in its predicted eye direction.
        public let confidence: Float?
        /// Value representing eye direction on the pitch axis.
        public let pitch: Float?
        /// Value representing eye direction on the yaw axis.
        public let yaw: Float?

        @inlinable
        public init(confidence: Float? = nil, pitch: Float? = nil, yaw: Float? = nil) {
            self.confidence = confidence
            self.pitch = pitch
            self.yaw = yaw
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case pitch = "Pitch"
            case yaw = "Yaw"
        }
    }

    public struct EyeOpen: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the eyes on the face are open.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct Eyeglasses: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the face is wearing eye glasses or not.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct Face: AWSDecodableShape {
        /// Bounding box of the face.
        public let boundingBox: BoundingBox?
        /// Confidence level that the bounding box contains a face (and not a different object such as a tree).
        public let confidence: Float?
        /// Identifier that you assign to all the faces in the input image.
        public let externalImageId: String?
        /// Unique identifier that Amazon Rekognition assigns to the face.
        public let faceId: String?
        /// Unique identifier that Amazon Rekognition assigns to the input image.
        public let imageId: String?
        ///  The version of the face detect and storage model that was used when indexing the face vector.
        public let indexFacesModelVersion: String?
        /// Unique identifier assigned to the user.
        public let userId: String?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, confidence: Float? = nil, externalImageId: String? = nil, faceId: String? = nil, imageId: String? = nil, indexFacesModelVersion: String? = nil, userId: String? = nil) {
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.externalImageId = externalImageId
            self.faceId = faceId
            self.imageId = imageId
            self.indexFacesModelVersion = indexFacesModelVersion
            self.userId = userId
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case externalImageId = "ExternalImageId"
            case faceId = "FaceId"
            case imageId = "ImageId"
            case indexFacesModelVersion = "IndexFacesModelVersion"
            case userId = "UserId"
        }
    }

    public struct FaceDetail: AWSDecodableShape {
        /// The estimated age range, in years, for the face. Low represents the lowest estimated age and High represents the highest estimated age.
        public let ageRange: AgeRange?
        /// Indicates whether or not the face has a beard, and the confidence level in the determination.
        public let beard: Beard?
        /// Bounding box of the face. Default attribute.
        public let boundingBox: BoundingBox?
        /// Confidence level that the bounding box contains a face (and not a different object such as a tree). Default attribute.
        public let confidence: Float?
        /// The emotions that appear to be expressed on the face, and the confidence level in the determination. The API is only making a determination of the physical appearance of a person's face. It is not a determination of the person’s internal emotional state and should not be used in such a way. For example, a person pretending to have a sad face might not be sad emotionally.
        public let emotions: [Emotion]?
        /// Indicates the direction the eyes are gazing in, as defined by pitch and yaw.
        public let eyeDirection: EyeDirection?
        /// Indicates whether or not the face is wearing eye glasses, and the confidence level in the determination.
        public let eyeglasses: Eyeglasses?
        /// Indicates whether or not the eyes on the face are open, and the confidence level in the determination.
        public let eyesOpen: EyeOpen?
        ///  FaceOccluded should return "true" with a high confidence score if a detected face’s eyes, nose, and mouth are partially captured or if they are covered by masks, dark sunglasses, cell phones, hands, or other objects. FaceOccluded should return "false" with a high confidence score if common occurrences that do not impact face verification are detected, such as eye glasses, lightly tinted sunglasses, strands of hair, and others.
        public let faceOccluded: FaceOccluded?
        /// The predicted gender of a detected face.
        public let gender: Gender?
        /// Indicates the location of landmarks on the face. Default attribute.
        public let landmarks: [Landmark]?
        /// Indicates whether or not the mouth on the face is open, and the confidence level in the determination.
        public let mouthOpen: MouthOpen?
        /// Indicates whether or not the face has a mustache, and the confidence level in the determination.
        public let mustache: Mustache?
        /// Indicates the pose of the face as determined by its pitch, roll, and yaw. Default attribute.
        public let pose: Pose?
        /// Identifies image brightness and sharpness. Default attribute.
        public let quality: ImageQuality?
        /// Indicates whether or not the face is smiling, and the confidence level in the determination.
        public let smile: Smile?
        /// Indicates whether or not the face is wearing sunglasses, and the confidence level in the determination.
        public let sunglasses: Sunglasses?

        @inlinable
        public init(ageRange: AgeRange? = nil, beard: Beard? = nil, boundingBox: BoundingBox? = nil, confidence: Float? = nil, emotions: [Emotion]? = nil, eyeDirection: EyeDirection? = nil, eyeglasses: Eyeglasses? = nil, eyesOpen: EyeOpen? = nil, faceOccluded: FaceOccluded? = nil, gender: Gender? = nil, landmarks: [Landmark]? = nil, mouthOpen: MouthOpen? = nil, mustache: Mustache? = nil, pose: Pose? = nil, quality: ImageQuality? = nil, smile: Smile? = nil, sunglasses: Sunglasses? = nil) {
            self.ageRange = ageRange
            self.beard = beard
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.emotions = emotions
            self.eyeDirection = eyeDirection
            self.eyeglasses = eyeglasses
            self.eyesOpen = eyesOpen
            self.faceOccluded = faceOccluded
            self.gender = gender
            self.landmarks = landmarks
            self.mouthOpen = mouthOpen
            self.mustache = mustache
            self.pose = pose
            self.quality = quality
            self.smile = smile
            self.sunglasses = sunglasses
        }

        private enum CodingKeys: String, CodingKey {
            case ageRange = "AgeRange"
            case beard = "Beard"
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case emotions = "Emotions"
            case eyeDirection = "EyeDirection"
            case eyeglasses = "Eyeglasses"
            case eyesOpen = "EyesOpen"
            case faceOccluded = "FaceOccluded"
            case gender = "Gender"
            case landmarks = "Landmarks"
            case mouthOpen = "MouthOpen"
            case mustache = "Mustache"
            case pose = "Pose"
            case quality = "Quality"
            case smile = "Smile"
            case sunglasses = "Sunglasses"
        }
    }

    public struct FaceDetection: AWSDecodableShape {
        /// The face properties for the detected face.
        public let face: FaceDetail?
        /// Time, in milliseconds from the start of the video, that the face was detected. Note that Timestamp is not guaranteed to be accurate to the individual frame where the face first appears.
        public let timestamp: Int64?

        @inlinable
        public init(face: FaceDetail? = nil, timestamp: Int64? = nil) {
            self.face = face
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case face = "Face"
            case timestamp = "Timestamp"
        }
    }

    public struct FaceMatch: AWSDecodableShape {
        /// Describes the face properties such as the bounding box, face ID, image ID of the source image, and external image ID that you assigned.
        public let face: Face?
        /// Confidence in the match of this face with the input face.
        public let similarity: Float?

        @inlinable
        public init(face: Face? = nil, similarity: Float? = nil) {
            self.face = face
            self.similarity = similarity
        }

        private enum CodingKeys: String, CodingKey {
            case face = "Face"
            case similarity = "Similarity"
        }
    }

    public struct FaceOccluded: AWSDecodableShape {
        /// The confidence that the service has detected the presence of a face occlusion.
        public let confidence: Float?
        /// True if a detected face’s eyes, nose, and mouth are partially captured or if they are covered by masks, dark sunglasses, cell phones, hands, or other objects. False if common occurrences that do not impact face verification are detected, such as eye glasses, lightly tinted sunglasses, strands of hair, and others.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct FaceRecord: AWSDecodableShape {
        /// Describes the face properties such as the bounding box, face ID, image ID of the input image, and external image ID that you assigned.
        public let face: Face?
        /// Structure containing attributes of the face that the algorithm detected.
        public let faceDetail: FaceDetail?

        @inlinable
        public init(face: Face? = nil, faceDetail: FaceDetail? = nil) {
            self.face = face
            self.faceDetail = faceDetail
        }

        private enum CodingKeys: String, CodingKey {
            case face = "Face"
            case faceDetail = "FaceDetail"
        }
    }

    public struct FaceSearchSettings: AWSEncodableShape & AWSDecodableShape {
        /// The ID of a collection that contains faces that you want to search for.
        public let collectionId: String?
        /// Minimum face match confidence score that must be met to return a result for a recognized face. The default is 80. 0 is the lowest confidence. 100 is the highest confidence. Values between 0 and 100 are accepted, and values lower than 80 are set to 80.
        public let faceMatchThreshold: Float?

        @inlinable
        public init(collectionId: String? = nil, faceMatchThreshold: Float? = nil) {
            self.collectionId = collectionId
            self.faceMatchThreshold = faceMatchThreshold
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case faceMatchThreshold = "FaceMatchThreshold"
        }
    }

    public struct Gender: AWSDecodableShape {
        /// Level of confidence in the prediction.
        public let confidence: Float?
        /// The predicted gender of the face.
        public let value: GenderType?

        @inlinable
        public init(confidence: Float? = nil, value: GenderType? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct GeneralLabelsSettings: AWSEncodableShape {
        /// The label categories that should be excluded from the return from DetectLabels.
        public let labelCategoryExclusionFilters: [String]?
        /// The label categories that should be included in the return from DetectLabels.
        public let labelCategoryInclusionFilters: [String]?
        /// The labels that should be excluded from the return from DetectLabels.
        public let labelExclusionFilters: [String]?
        /// The labels that should be included in the return from DetectLabels.
        public let labelInclusionFilters: [String]?

        @inlinable
        public init(labelCategoryExclusionFilters: [String]? = nil, labelCategoryInclusionFilters: [String]? = nil, labelExclusionFilters: [String]? = nil, labelInclusionFilters: [String]? = nil) {
            self.labelCategoryExclusionFilters = labelCategoryExclusionFilters
            self.labelCategoryInclusionFilters = labelCategoryInclusionFilters
            self.labelExclusionFilters = labelExclusionFilters
            self.labelInclusionFilters = labelInclusionFilters
        }

        public func validate(name: String) throws {
            try self.labelCategoryExclusionFilters?.forEach {
                try validate($0, name: "labelCategoryExclusionFilters[]", parent: name, max: 50)
                try validate($0, name: "labelCategoryExclusionFilters[]", parent: name, pattern: "^[A-Za-z0-9àâèçñó'-_(). ]*$")
            }
            try self.validate(self.labelCategoryExclusionFilters, name: "labelCategoryExclusionFilters", parent: name, max: 100)
            try self.labelCategoryInclusionFilters?.forEach {
                try validate($0, name: "labelCategoryInclusionFilters[]", parent: name, max: 50)
                try validate($0, name: "labelCategoryInclusionFilters[]", parent: name, pattern: "^[A-Za-z0-9àâèçñó'-_(). ]*$")
            }
            try self.validate(self.labelCategoryInclusionFilters, name: "labelCategoryInclusionFilters", parent: name, max: 100)
            try self.labelExclusionFilters?.forEach {
                try validate($0, name: "labelExclusionFilters[]", parent: name, max: 50)
                try validate($0, name: "labelExclusionFilters[]", parent: name, pattern: "^[A-Za-z0-9àâèçñó'-_(). ]*$")
            }
            try self.validate(self.labelExclusionFilters, name: "labelExclusionFilters", parent: name, max: 100)
            try self.labelInclusionFilters?.forEach {
                try validate($0, name: "labelInclusionFilters[]", parent: name, max: 50)
                try validate($0, name: "labelInclusionFilters[]", parent: name, pattern: "^[A-Za-z0-9àâèçñó'-_(). ]*$")
            }
            try self.validate(self.labelInclusionFilters, name: "labelInclusionFilters", parent: name, max: 100)
        }

        private enum CodingKeys: String, CodingKey {
            case labelCategoryExclusionFilters = "LabelCategoryExclusionFilters"
            case labelCategoryInclusionFilters = "LabelCategoryInclusionFilters"
            case labelExclusionFilters = "LabelExclusionFilters"
            case labelInclusionFilters = "LabelInclusionFilters"
        }
    }

    public struct Geometry: AWSDecodableShape {
        /// An axis-aligned coarse representation of the detected item's location on the image.
        public let boundingBox: BoundingBox?
        /// Within the bounding box, a fine-grained polygon around the detected item.
        public let polygon: [Point]?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, polygon: [Point]? = nil) {
            self.boundingBox = boundingBox
            self.polygon = polygon
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case polygon = "Polygon"
        }
    }

    public struct GetCelebrityInfoRequest: AWSEncodableShape {
        /// The ID for the celebrity. You get the celebrity ID from a call to the RecognizeCelebrities operation, which recognizes celebrities in an image.
        public let id: String

        @inlinable
        public init(id: String) {
            self.id = id
        }

        public func validate(name: String) throws {
            try self.validate(self.id, name: "id", parent: name, pattern: "^[0-9A-Za-z]*$")
        }

        private enum CodingKeys: String, CodingKey {
            case id = "Id"
        }
    }

    public struct GetCelebrityInfoResponse: AWSDecodableShape {
        /// Retrieves the known gender for the celebrity.
        public let knownGender: KnownGender?
        /// The name of the celebrity.
        public let name: String?
        /// An array of URLs pointing to additional celebrity information.
        public let urls: [String]?

        @inlinable
        public init(knownGender: KnownGender? = nil, name: String? = nil, urls: [String]? = nil) {
            self.knownGender = knownGender
            self.name = name
            self.urls = urls
        }

        private enum CodingKeys: String, CodingKey {
            case knownGender = "KnownGender"
            case name = "Name"
            case urls = "Urls"
        }
    }

    public struct GetCelebrityRecognitionRequest: AWSEncodableShape {
        /// Job identifier for the required celebrity recognition analysis. You can get the job identifer from a call to StartCelebrityRecognition.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.  If you specify a value greater than 1000, a maximum of 1000 results is returned. The default value is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more recognized celebrities to retrieve), Amazon Rekognition Video returns a pagination token in the response. You can use this pagination token to retrieve the next set of celebrities.
        public let nextToken: String?
        /// Sort to use for celebrities returned in Celebrities field. Specify ID to sort by the celebrity identifier, specify TIMESTAMP to sort by the time the celebrity was recognized.
        public let sortBy: CelebrityRecognitionSortBy?

        @inlinable
        public init(jobId: String, maxResults: Int? = nil, nextToken: String? = nil, sortBy: CelebrityRecognitionSortBy? = nil) {
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sortBy = sortBy
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sortBy = "SortBy"
        }
    }

    public struct GetCelebrityRecognitionResponse: AWSDecodableShape {
        /// Array of celebrities recognized in the video.
        public let celebrities: [CelebrityRecognition]?
        /// Job identifier for the celebrity recognition operation for which you want to obtain results. The job identifer is returned by an initial call to StartCelebrityRecognition.
        public let jobId: String?
        /// The current status of the celebrity recognition job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartCelebrityRecognition and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent request to retrieve the next set of celebrities.
        public let nextToken: String?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Information about a video that Amazon Rekognition Video analyzed. Videometadata is returned in every page of paginated responses from a Amazon Rekognition Video operation.
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(celebrities: [CelebrityRecognition]? = nil, jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, nextToken: String? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.celebrities = celebrities
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.nextToken = nextToken
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case celebrities = "Celebrities"
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case nextToken = "NextToken"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetContentModerationRequest: AWSEncodableShape {
        /// Defines how to aggregate results of the StartContentModeration request. Default aggregation option is TIMESTAMPS. SEGMENTS mode aggregates moderation labels over time.
        public let aggregateBy: ContentModerationAggregateBy?
        /// The identifier for the inappropriate, unwanted, or offensive content moderation job. Use JobId to identify the job in a subsequent call to GetContentModeration.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.  If you specify a value greater than 1000, a maximum of 1000 results is returned. The default value is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more data to retrieve), Amazon Rekognition returns a pagination token in the response. You can use this pagination token to retrieve the next set of content moderation labels.
        public let nextToken: String?
        /// Sort to use for elements in the ModerationLabelDetections array. Use TIMESTAMP to sort array elements by the time labels are detected. Use NAME to alphabetically group elements for a label together. Within each label group, the array element are sorted by detection confidence. The default sort is by TIMESTAMP.
        public let sortBy: ContentModerationSortBy?

        @inlinable
        public init(aggregateBy: ContentModerationAggregateBy? = nil, jobId: String, maxResults: Int? = nil, nextToken: String? = nil, sortBy: ContentModerationSortBy? = nil) {
            self.aggregateBy = aggregateBy
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sortBy = sortBy
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregateBy = "AggregateBy"
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sortBy = "SortBy"
        }
    }

    public struct GetContentModerationRequestMetadata: AWSDecodableShape {
        /// The aggregation method chosen for a GetContentModeration request.
        public let aggregateBy: ContentModerationAggregateBy?
        /// The sorting method chosen for a GetContentModeration request.
        public let sortBy: ContentModerationSortBy?

        @inlinable
        public init(aggregateBy: ContentModerationAggregateBy? = nil, sortBy: ContentModerationSortBy? = nil) {
            self.aggregateBy = aggregateBy
            self.sortBy = sortBy
        }

        private enum CodingKeys: String, CodingKey {
            case aggregateBy = "AggregateBy"
            case sortBy = "SortBy"
        }
    }

    public struct GetContentModerationResponse: AWSDecodableShape {
        /// Information about the paramters used when getting a response. Includes information on aggregation and sorting methods.
        public let getRequestMetadata: GetContentModerationRequestMetadata?
        /// Job identifier for the content moderation operation for which you want to obtain results. The job identifer is returned by an initial call to StartContentModeration.
        public let jobId: String?
        /// The current status of the content moderation analysis job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartContentModeration and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// The detected inappropriate, unwanted, or offensive content moderation labels and the time(s) they were detected.
        public let moderationLabels: [ContentModerationDetection]?
        /// Version number of the moderation detection model that was used to detect inappropriate, unwanted, or offensive content.
        public let moderationModelVersion: String?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent request to retrieve the next set of content moderation labels.
        public let nextToken: String?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Information about a video that Amazon Rekognition analyzed. Videometadata is returned in every page of paginated responses from GetContentModeration.
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(getRequestMetadata: GetContentModerationRequestMetadata? = nil, jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, moderationLabels: [ContentModerationDetection]? = nil, moderationModelVersion: String? = nil, nextToken: String? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.getRequestMetadata = getRequestMetadata
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.moderationLabels = moderationLabels
            self.moderationModelVersion = moderationModelVersion
            self.nextToken = nextToken
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case getRequestMetadata = "GetRequestMetadata"
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case moderationLabels = "ModerationLabels"
            case moderationModelVersion = "ModerationModelVersion"
            case nextToken = "NextToken"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetFaceDetectionRequest: AWSEncodableShape {
        /// Unique identifier for the face detection job. The JobId is returned from StartFaceDetection.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.  If you specify a value greater than 1000, a maximum of 1000 results is returned. The default value is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there are more faces to retrieve), Amazon Rekognition Video returns a pagination token in the response. You can use this pagination token to retrieve the next set of faces.
        public let nextToken: String?

        @inlinable
        public init(jobId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct GetFaceDetectionResponse: AWSDecodableShape {
        /// An array of faces detected in the video. Each element contains a detected face's details and the time, in milliseconds from the start of the video, the face was detected.
        public let faces: [FaceDetection]?
        /// Job identifier for the face detection operation for which you want to obtain results. The job identifer is returned by an initial call to StartFaceDetection.
        public let jobId: String?
        /// The current status of the face detection job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartFaceDetection and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// If the response is truncated, Amazon Rekognition returns this token that you can use in the subsequent request to retrieve the next set of faces.
        public let nextToken: String?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Information about a video that Amazon Rekognition Video analyzed. Videometadata is returned in every page of paginated responses from a Amazon Rekognition video operation.
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(faces: [FaceDetection]? = nil, jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, nextToken: String? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.faces = faces
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.nextToken = nextToken
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case faces = "Faces"
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case nextToken = "NextToken"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetFaceLivenessSessionResultsRequest: AWSEncodableShape {
        /// A unique 128-bit UUID. This is used to uniquely identify the session and also acts as an idempotency token for all operations associated with the session.
        public let sessionId: String

        @inlinable
        public init(sessionId: String) {
            self.sessionId = sessionId
        }

        public func validate(name: String) throws {
            try self.validate(self.sessionId, name: "sessionId", parent: name, max: 36)
            try self.validate(self.sessionId, name: "sessionId", parent: name, min: 36)
            try self.validate(self.sessionId, name: "sessionId", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
        }
    }

    public struct GetFaceLivenessSessionResultsResponse: AWSDecodableShape {
        /// A set of images from the Face Liveness video that can be used for audit purposes. It includes a bounding box of the face and the Base64-encoded bytes that return an image. If the CreateFaceLivenessSession request included an OutputConfig argument, the image will be uploaded to an S3Object specified in the output configuration. If no Amazon S3 bucket is defined, raw bytes are sent instead.
        public let auditImages: [AuditImage]?
        /// Contains information regarding the challenge type used for the Face Liveness check.
        public let challenge: Challenge?
        /// Probabalistic confidence score for if the person in the given video was live, represented as a float value between 0 to 100.
        public let confidence: Float?
        /// A high-quality image from the Face Liveness video that can be used for face comparison or search. It includes a bounding box of the face and the Base64-encoded bytes that return an image. If the CreateFaceLivenessSession request included an OutputConfig argument, the image will be uploaded to an S3Object specified in the output configuration. In case the reference image is not returned, it's recommended to retry the Liveness check.
        public let referenceImage: AuditImage?
        /// The sessionId for which this request was called.
        public let sessionId: String
        /// Represents a status corresponding to the state of the session. Possible statuses are: CREATED, IN_PROGRESS, SUCCEEDED, FAILED, EXPIRED.
        public let status: LivenessSessionStatus

        @inlinable
        public init(auditImages: [AuditImage]? = nil, challenge: Challenge? = nil, confidence: Float? = nil, referenceImage: AuditImage? = nil, sessionId: String, status: LivenessSessionStatus) {
            self.auditImages = auditImages
            self.challenge = challenge
            self.confidence = confidence
            self.referenceImage = referenceImage
            self.sessionId = sessionId
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case auditImages = "AuditImages"
            case challenge = "Challenge"
            case confidence = "Confidence"
            case referenceImage = "ReferenceImage"
            case sessionId = "SessionId"
            case status = "Status"
        }
    }

    public struct GetFaceSearchRequest: AWSEncodableShape {
        /// The job identifer for the search request. You get the job identifier from an initial call to StartFaceSearch.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.  If you specify a value greater than 1000, a maximum of 1000 results is returned. The default value is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more search results to retrieve), Amazon Rekognition Video returns a pagination token in the response. You can use this pagination token to retrieve the next set of search results.
        public let nextToken: String?
        /// Sort to use for grouping faces in the response. Use TIMESTAMP to group faces by the time that they are recognized. Use INDEX to sort by recognized faces.
        public let sortBy: FaceSearchSortBy?

        @inlinable
        public init(jobId: String, maxResults: Int? = nil, nextToken: String? = nil, sortBy: FaceSearchSortBy? = nil) {
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sortBy = sortBy
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sortBy = "SortBy"
        }
    }

    public struct GetFaceSearchResponse: AWSDecodableShape {
        /// Job identifier for the face search operation for which you want to obtain results. The job identifer is returned by an initial call to StartFaceSearch.
        public let jobId: String?
        /// The current status of the face search job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartFaceSearch and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent request to retrieve the next set of search results.
        public let nextToken: String?
        /// An array of persons,  PersonMatch, in the video whose face(s) match the face(s) in an Amazon Rekognition collection. It also includes time information for when persons are matched in the video. You specify the input collection in an initial call to StartFaceSearch. Each  Persons element includes a time the person was matched, face match details (FaceMatches) for matching faces in the collection, and person information (Person) for the matched person.
        public let persons: [PersonMatch]?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Information about a video that Amazon Rekognition analyzed. Videometadata is returned in every page of paginated responses from a Amazon Rekognition Video operation.
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, nextToken: String? = nil, persons: [PersonMatch]? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.nextToken = nextToken
            self.persons = persons
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case nextToken = "NextToken"
            case persons = "Persons"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetLabelDetectionRequest: AWSEncodableShape {
        /// Defines how to aggregate the returned results. Results can be aggregated by timestamps or segments.
        public let aggregateBy: LabelDetectionAggregateBy?
        /// Job identifier for the label detection operation for which you want results returned. You get the job identifer from an initial call to StartlabelDetection.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.  If you specify a value greater than 1000, a maximum of 1000 results is returned. The default value is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there are more labels to retrieve), Amazon Rekognition Video returns a pagination token in the response. You can use this pagination token to retrieve the next set of labels.
        public let nextToken: String?
        /// Sort to use for elements in the Labels array. Use TIMESTAMP to sort array elements by the time labels are detected. Use NAME to alphabetically group elements for a label together. Within each label group, the array element are sorted by detection confidence. The default sort is by TIMESTAMP.
        public let sortBy: LabelDetectionSortBy?

        @inlinable
        public init(aggregateBy: LabelDetectionAggregateBy? = nil, jobId: String, maxResults: Int? = nil, nextToken: String? = nil, sortBy: LabelDetectionSortBy? = nil) {
            self.aggregateBy = aggregateBy
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sortBy = sortBy
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case aggregateBy = "AggregateBy"
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sortBy = "SortBy"
        }
    }

    public struct GetLabelDetectionRequestMetadata: AWSDecodableShape {
        /// The aggregation method chosen for a GetLabelDetection request.
        public let aggregateBy: LabelDetectionAggregateBy?
        /// The sorting method chosen for a GetLabelDetection request.
        public let sortBy: LabelDetectionSortBy?

        @inlinable
        public init(aggregateBy: LabelDetectionAggregateBy? = nil, sortBy: LabelDetectionSortBy? = nil) {
            self.aggregateBy = aggregateBy
            self.sortBy = sortBy
        }

        private enum CodingKeys: String, CodingKey {
            case aggregateBy = "AggregateBy"
            case sortBy = "SortBy"
        }
    }

    public struct GetLabelDetectionResponse: AWSDecodableShape {
        /// Information about the paramters used when getting a response. Includes information on aggregation and sorting methods.
        public let getRequestMetadata: GetLabelDetectionRequestMetadata?
        /// Job identifier for the label detection operation for which you want to obtain results. The job identifer is returned by an initial call to StartLabelDetection.
        public let jobId: String?
        /// The current status of the label detection job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartLabelDetection and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// Version number of the label detection model that was used to detect labels.
        public let labelModelVersion: String?
        /// An array of labels detected in the video. Each element contains the detected label and the time, in milliseconds from the start of the video, that the label was detected.
        public let labels: [LabelDetection]?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent request to retrieve the next set of labels.
        public let nextToken: String?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Information about a video that Amazon Rekognition Video analyzed. Videometadata is returned in every page of paginated responses from a Amazon Rekognition video operation.
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(getRequestMetadata: GetLabelDetectionRequestMetadata? = nil, jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, labelModelVersion: String? = nil, labels: [LabelDetection]? = nil, nextToken: String? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.getRequestMetadata = getRequestMetadata
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.labelModelVersion = labelModelVersion
            self.labels = labels
            self.nextToken = nextToken
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case getRequestMetadata = "GetRequestMetadata"
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case labelModelVersion = "LabelModelVersion"
            case labels = "Labels"
            case nextToken = "NextToken"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetMediaAnalysisJobRequest: AWSEncodableShape {
        /// Unique identifier for the media analysis job for which you want to retrieve results.
        public let jobId: String

        @inlinable
        public init(jobId: String) {
            self.jobId = jobId
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct GetMediaAnalysisJobResponse: AWSDecodableShape {
        /// The Unix date and time when the job finished.
        public let completionTimestamp: Date?
        /// The Unix date and time when the job was started.
        public let creationTimestamp: Date
        /// Details about the error that resulted in failure of the job.
        public let failureDetails: MediaAnalysisJobFailureDetails?
        /// Reference to the input manifest that was provided in the job creation request.
        public let input: MediaAnalysisInput
        /// The identifier for the media analysis job.
        public let jobId: String
        /// The name of the media analysis job.
        public let jobName: String?
        /// KMS Key that was provided in the creation request.
        public let kmsKeyId: String?
        /// The summary manifest provides statistics on input manifest and errors identified in the input manifest.
        public let manifestSummary: MediaAnalysisManifestSummary?
        /// Operation configurations that were provided during job creation.
        public let operationsConfig: MediaAnalysisOperationsConfig
        /// Output configuration that was provided in the creation request.
        public let outputConfig: MediaAnalysisOutputConfig
        /// Output manifest that contains prediction results.
        public let results: MediaAnalysisResults?
        /// The current status of the media analysis job.
        public let status: MediaAnalysisJobStatus

        @inlinable
        public init(completionTimestamp: Date? = nil, creationTimestamp: Date, failureDetails: MediaAnalysisJobFailureDetails? = nil, input: MediaAnalysisInput, jobId: String, jobName: String? = nil, kmsKeyId: String? = nil, manifestSummary: MediaAnalysisManifestSummary? = nil, operationsConfig: MediaAnalysisOperationsConfig, outputConfig: MediaAnalysisOutputConfig, results: MediaAnalysisResults? = nil, status: MediaAnalysisJobStatus) {
            self.completionTimestamp = completionTimestamp
            self.creationTimestamp = creationTimestamp
            self.failureDetails = failureDetails
            self.input = input
            self.jobId = jobId
            self.jobName = jobName
            self.kmsKeyId = kmsKeyId
            self.manifestSummary = manifestSummary
            self.operationsConfig = operationsConfig
            self.outputConfig = outputConfig
            self.results = results
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case completionTimestamp = "CompletionTimestamp"
            case creationTimestamp = "CreationTimestamp"
            case failureDetails = "FailureDetails"
            case input = "Input"
            case jobId = "JobId"
            case jobName = "JobName"
            case kmsKeyId = "KmsKeyId"
            case manifestSummary = "ManifestSummary"
            case operationsConfig = "OperationsConfig"
            case outputConfig = "OutputConfig"
            case results = "Results"
            case status = "Status"
        }
    }

    public struct GetPersonTrackingRequest: AWSEncodableShape {
        /// The identifier for a job that tracks persons in a video. You get the JobId from a call to StartPersonTracking.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.  If you specify a value greater than 1000, a maximum of 1000 results is returned. The default value is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there are more persons to retrieve), Amazon Rekognition Video returns a pagination token in the response. You can use this pagination token to retrieve the next set of persons.
        public let nextToken: String?
        /// Sort to use for elements in the Persons array. Use TIMESTAMP to sort array elements by the time persons are detected. Use INDEX to sort by the tracked persons. If you sort by INDEX, the array elements for each person are sorted by detection confidence. The default sort is by TIMESTAMP.
        public let sortBy: PersonTrackingSortBy?

        @inlinable
        public init(jobId: String, maxResults: Int? = nil, nextToken: String? = nil, sortBy: PersonTrackingSortBy? = nil) {
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sortBy = sortBy
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sortBy = "SortBy"
        }
    }

    public struct GetPersonTrackingResponse: AWSDecodableShape {
        /// Job identifier for the person tracking operation for which you want to obtain results. The job identifer is returned by an initial call to StartPersonTracking.
        public let jobId: String?
        /// The current status of the person tracking job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartCelebrityRecognition and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent request to retrieve the next set of persons.
        public let nextToken: String?
        /// An array of the persons detected in the video and the time(s) their path was tracked throughout the video. An array element will exist for each time a person's path is tracked.
        public let persons: [PersonDetection]?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Information about a video that Amazon Rekognition Video analyzed. Videometadata is returned in every page of paginated responses from a Amazon Rekognition Video operation.
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, nextToken: String? = nil, persons: [PersonDetection]? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.nextToken = nextToken
            self.persons = persons
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case nextToken = "NextToken"
            case persons = "Persons"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetSegmentDetectionRequest: AWSEncodableShape {
        /// Job identifier for the text detection operation for which you want results returned.  You get the job identifer from an initial call to StartSegmentDetection.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.
        public let maxResults: Int?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent  request to retrieve the next set of text.
        public let nextToken: String?

        @inlinable
        public init(jobId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct GetSegmentDetectionResponse: AWSDecodableShape {
        /// An array of  objects. There can be multiple audio streams.  Each AudioMetadata object contains metadata for a single audio stream. Audio information in an AudioMetadata objects includes  the audio codec, the number of audio channels, the duration of the audio stream, and the sample rate. Audio metadata is returned in each page of information returned by GetSegmentDetection.
        public let audioMetadata: [AudioMetadata]?
        /// Job identifier for the segment detection operation for which you want to obtain results. The job identifer is returned by an initial call to StartSegmentDetection.
        public let jobId: String?
        /// Current status of the segment detection job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartSegmentDetection and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// If the previous response was incomplete (because there are more labels to retrieve), Amazon Rekognition Video returns  a pagination token in the response. You can use this pagination token to retrieve the next set of text.
        public let nextToken: String?
        /// An array of segments detected in a video.  The array is sorted by the segment types (TECHNICAL_CUE or SHOT)  specified in the SegmentTypes input parameter of StartSegmentDetection. Within each segment type the array is sorted by timestamp values.
        public let segments: [SegmentDetection]?
        /// An array containing the segment types requested in the call to StartSegmentDetection.
        public let selectedSegmentTypes: [SegmentTypeInfo]?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        public let video: Video?
        /// Currently, Amazon Rekognition Video returns a single   object in the VideoMetadata array. The object contains information about the video stream in the input file that Amazon Rekognition Video chose to analyze.   The VideoMetadata object includes the video codec, video format and other information. Video metadata is returned in each page of information returned by GetSegmentDetection.
        public let videoMetadata: [VideoMetadata]?

        @inlinable
        public init(audioMetadata: [AudioMetadata]? = nil, jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, nextToken: String? = nil, segments: [SegmentDetection]? = nil, selectedSegmentTypes: [SegmentTypeInfo]? = nil, statusMessage: String? = nil, video: Video? = nil, videoMetadata: [VideoMetadata]? = nil) {
            self.audioMetadata = audioMetadata
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.nextToken = nextToken
            self.segments = segments
            self.selectedSegmentTypes = selectedSegmentTypes
            self.statusMessage = statusMessage
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case audioMetadata = "AudioMetadata"
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case nextToken = "NextToken"
            case segments = "Segments"
            case selectedSegmentTypes = "SelectedSegmentTypes"
            case statusMessage = "StatusMessage"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GetTextDetectionRequest: AWSEncodableShape {
        /// Job identifier for the text detection operation for which you want results returned.  You get the job identifer from an initial call to StartTextDetection.
        public let jobId: String
        /// Maximum number of results to return per paginated call. The largest value you can specify is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there are more labels to retrieve), Amazon Rekognition Video returns  a pagination token in the response. You can use this pagination token to retrieve the next set of text.
        public let nextToken: String?

        @inlinable
        public init(jobId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.jobId = jobId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.jobId, name: "jobId", parent: name, max: 64)
            try self.validate(self.jobId, name: "jobId", parent: name, min: 1)
            try self.validate(self.jobId, name: "jobId", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct GetTextDetectionResponse: AWSDecodableShape {
        /// Job identifier for the text detection operation for which you want to obtain results. The job identifer is returned by an initial call to StartTextDetection.
        public let jobId: String?
        /// Current status of the text detection job.
        public let jobStatus: VideoJobStatus?
        /// A job identifier specified in the call to StartTextDetection and returned in the job completion notification sent to your Amazon Simple Notification Service topic.
        public let jobTag: String?
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent  request to retrieve the next set of text.
        public let nextToken: String?
        /// If the job fails, StatusMessage provides a descriptive error message.
        public let statusMessage: String?
        /// An array of text detected in the video. Each element contains the detected text, the time in milliseconds from the start of the video that the text was detected, and where it was detected on the screen.
        public let textDetections: [TextDetectionResult]?
        /// Version number of the text detection model that was used to detect text.
        public let textModelVersion: String?
        public let video: Video?
        public let videoMetadata: VideoMetadata?

        @inlinable
        public init(jobId: String? = nil, jobStatus: VideoJobStatus? = nil, jobTag: String? = nil, nextToken: String? = nil, statusMessage: String? = nil, textDetections: [TextDetectionResult]? = nil, textModelVersion: String? = nil, video: Video? = nil, videoMetadata: VideoMetadata? = nil) {
            self.jobId = jobId
            self.jobStatus = jobStatus
            self.jobTag = jobTag
            self.nextToken = nextToken
            self.statusMessage = statusMessage
            self.textDetections = textDetections
            self.textModelVersion = textModelVersion
            self.video = video
            self.videoMetadata = videoMetadata
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
            case jobStatus = "JobStatus"
            case jobTag = "JobTag"
            case nextToken = "NextToken"
            case statusMessage = "StatusMessage"
            case textDetections = "TextDetections"
            case textModelVersion = "TextModelVersion"
            case video = "Video"
            case videoMetadata = "VideoMetadata"
        }
    }

    public struct GroundTruthManifest: AWSEncodableShape & AWSDecodableShape {
        public let s3Object: S3Object?

        @inlinable
        public init(s3Object: S3Object? = nil) {
            self.s3Object = s3Object
        }

        public func validate(name: String) throws {
            try self.s3Object?.validate(name: "\(name).s3Object")
        }

        private enum CodingKeys: String, CodingKey {
            case s3Object = "S3Object"
        }
    }

    public struct HumanLoopActivationOutput: AWSDecodableShape {
        /// Shows the result of condition evaluations, including those conditions which activated a human review.
        public let humanLoopActivationConditionsEvaluationResults: String?
        /// Shows if and why human review was needed.
        public let humanLoopActivationReasons: [String]?
        /// The Amazon Resource Name (ARN) of the HumanLoop created.
        public let humanLoopArn: String?

        @inlinable
        public init(humanLoopActivationConditionsEvaluationResults: String? = nil, humanLoopActivationReasons: [String]? = nil, humanLoopArn: String? = nil) {
            self.humanLoopActivationConditionsEvaluationResults = humanLoopActivationConditionsEvaluationResults
            self.humanLoopActivationReasons = humanLoopActivationReasons
            self.humanLoopArn = humanLoopArn
        }

        private enum CodingKeys: String, CodingKey {
            case humanLoopActivationConditionsEvaluationResults = "HumanLoopActivationConditionsEvaluationResults"
            case humanLoopActivationReasons = "HumanLoopActivationReasons"
            case humanLoopArn = "HumanLoopArn"
        }
    }

    public struct HumanLoopConfig: AWSEncodableShape {
        /// Sets attributes of the input data.
        public let dataAttributes: HumanLoopDataAttributes?
        /// The Amazon Resource Name (ARN) of the flow definition. You can create a flow definition by using the Amazon Sagemaker CreateFlowDefinition Operation.
        public let flowDefinitionArn: String
        /// The name of the human review used for this image. This should be kept unique within a region.
        public let humanLoopName: String

        @inlinable
        public init(dataAttributes: HumanLoopDataAttributes? = nil, flowDefinitionArn: String, humanLoopName: String) {
            self.dataAttributes = dataAttributes
            self.flowDefinitionArn = flowDefinitionArn
            self.humanLoopName = humanLoopName
        }

        public func validate(name: String) throws {
            try self.dataAttributes?.validate(name: "\(name).dataAttributes")
            try self.validate(self.flowDefinitionArn, name: "flowDefinitionArn", parent: name, max: 256)
            try self.validate(self.humanLoopName, name: "humanLoopName", parent: name, max: 63)
            try self.validate(self.humanLoopName, name: "humanLoopName", parent: name, min: 1)
            try self.validate(self.humanLoopName, name: "humanLoopName", parent: name, pattern: "^[a-z0-9](-*[a-z0-9])*$")
        }

        private enum CodingKeys: String, CodingKey {
            case dataAttributes = "DataAttributes"
            case flowDefinitionArn = "FlowDefinitionArn"
            case humanLoopName = "HumanLoopName"
        }
    }

    public struct HumanLoopDataAttributes: AWSEncodableShape {
        /// Sets whether the input image is free of personally identifiable information.
        public let contentClassifiers: [ContentClassifier]?

        @inlinable
        public init(contentClassifiers: [ContentClassifier]? = nil) {
            self.contentClassifiers = contentClassifiers
        }

        public func validate(name: String) throws {
            try self.validate(self.contentClassifiers, name: "contentClassifiers", parent: name, max: 256)
        }

        private enum CodingKeys: String, CodingKey {
            case contentClassifiers = "ContentClassifiers"
        }
    }

    public struct HumanLoopQuotaExceededException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?
        /// The quota code.
        public let quotaCode: String?
        /// The resource type.
        public let resourceType: String?
        /// The service code.
        public let serviceCode: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil, quotaCode: String? = nil, resourceType: String? = nil, serviceCode: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
            self.quotaCode = quotaCode
            self.resourceType = resourceType
            self.serviceCode = serviceCode
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
            case quotaCode = "QuotaCode"
            case resourceType = "ResourceType"
            case serviceCode = "ServiceCode"
        }
    }

    public struct IdempotentParameterMismatchException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct Image: AWSEncodableShape {
        /// Blob of image bytes up to 5 MBs. Note that the maximum image size you can pass to DetectCustomLabels is 4MB.
        public let bytes: AWSBase64Data?
        /// Identifies an S3 object as the image source.
        public let s3Object: S3Object?

        @inlinable
        public init(bytes: AWSBase64Data? = nil, s3Object: S3Object? = nil) {
            self.bytes = bytes
            self.s3Object = s3Object
        }

        public func validate(name: String) throws {
            try self.validate(self.bytes, name: "bytes", parent: name, max: 5242880)
            try self.validate(self.bytes, name: "bytes", parent: name, min: 1)
            try self.s3Object?.validate(name: "\(name).s3Object")
        }

        private enum CodingKeys: String, CodingKey {
            case bytes = "Bytes"
            case s3Object = "S3Object"
        }
    }

    public struct ImageQuality: AWSDecodableShape {
        /// Value representing brightness of the face. The service returns a value between 0 and 100 (inclusive). A higher value indicates a brighter face image.
        public let brightness: Float?
        /// Value representing sharpness of the face. The service returns a value between 0 and 100 (inclusive). A higher value indicates a sharper face image.
        public let sharpness: Float?

        @inlinable
        public init(brightness: Float? = nil, sharpness: Float? = nil) {
            self.brightness = brightness
            self.sharpness = sharpness
        }

        private enum CodingKeys: String, CodingKey {
            case brightness = "Brightness"
            case sharpness = "Sharpness"
        }
    }

    public struct ImageTooLargeException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct IndexFacesRequest: AWSEncodableShape {
        /// The ID of an existing collection to which you want to add the faces that are detected in the input images.
        public let collectionId: String
        /// An array of facial attributes you want to be returned. A DEFAULT subset of facial attributes - BoundingBox, Confidence, Pose, Quality, and Landmarks - will always be returned. You can request for specific facial attributes (in addition to the default list) - by using ["DEFAULT", "FACE_OCCLUDED"] or just ["FACE_OCCLUDED"]. You can request for all facial attributes by using ["ALL"]. Requesting more attributes may increase response time. If you provide both, ["ALL", "DEFAULT"], the service uses a logical AND operator to determine which attributes to return (in this case, all attributes).
        public let detectionAttributes: [Attribute]?
        /// The ID you want to assign to all the faces detected in the image.
        public let externalImageId: String?
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes isn't supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image
        /// The maximum number of faces to index. The value of MaxFaces must be greater than or equal to 1. IndexFaces returns no more than 100 detected faces in an image, even if you specify a larger value for MaxFaces. If IndexFaces detects more faces than the value of MaxFaces, the faces with the lowest quality are filtered out first. If there are still more faces than the value of MaxFaces, the faces with the smallest bounding boxes are filtered out (up to the number that's needed to satisfy the value of MaxFaces). Information about the unindexed faces is available in the UnindexedFaces array.  The faces that are returned by IndexFaces are sorted by the largest face bounding box size to the smallest size, in descending order.  MaxFaces can be used with a collection associated with any version of the face model.
        public let maxFaces: Int?
        /// A filter that specifies a quality bar for how much filtering is done to identify faces. Filtered faces aren't indexed. If you specify AUTO, Amazon Rekognition chooses the quality bar. If you specify LOW, MEDIUM, or HIGH, filtering removes all faces that don’t meet the chosen quality bar. The default value is AUTO.  The quality bar is based on a variety of common use cases. Low-quality detections can occur for a number of reasons. Some examples are an object that's misidentified as a face, a face that's too blurry, or a face with a pose that's too extreme to use. If you specify NONE, no filtering is performed.  To use quality filtering, the collection you are using must be associated with version 3 of the face model or higher.
        public let qualityFilter: QualityFilter?

        @inlinable
        public init(collectionId: String, detectionAttributes: [Attribute]? = nil, externalImageId: String? = nil, image: Image, maxFaces: Int? = nil, qualityFilter: QualityFilter? = nil) {
            self.collectionId = collectionId
            self.detectionAttributes = detectionAttributes
            self.externalImageId = externalImageId
            self.image = image
            self.maxFaces = maxFaces
            self.qualityFilter = qualityFilter
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.externalImageId, name: "externalImageId", parent: name, max: 255)
            try self.validate(self.externalImageId, name: "externalImageId", parent: name, min: 1)
            try self.validate(self.externalImageId, name: "externalImageId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
            try self.image.validate(name: "\(name).image")
            try self.validate(self.maxFaces, name: "maxFaces", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case detectionAttributes = "DetectionAttributes"
            case externalImageId = "ExternalImageId"
            case image = "Image"
            case maxFaces = "MaxFaces"
            case qualityFilter = "QualityFilter"
        }
    }

    public struct IndexFacesResponse: AWSDecodableShape {
        /// The version number of the face detection model that's associated with the input collection (CollectionId).
        public let faceModelVersion: String?
        /// An array of faces detected and added to the collection. For more information, see Searching Faces in a Collection in the Amazon Rekognition Developer Guide.
        public let faceRecords: [FaceRecord]?
        /// If your collection is associated with a face detection model that's later than version 3.0, the value of OrientationCorrection is always null and no orientation information is returned. If your collection is associated with a face detection model that's version 3.0 or earlier, the following applies:   If the input image is in .jpeg format, it might contain exchangeable image file format (Exif) metadata that includes the image's orientation. Amazon Rekognition uses this orientation information to perform image correction - the bounding box coordinates are translated to represent object locations after the orientation information in the Exif metadata is used to correct the image orientation. Images in .png format don't contain Exif metadata. The value of OrientationCorrection is null.   If the image doesn't contain orientation information in its Exif metadata, Amazon Rekognition returns an estimated orientation (ROTATE_0, ROTATE_90, ROTATE_180, ROTATE_270). Amazon Rekognition doesn’t perform image correction for images. The bounding box coordinates aren't translated and represent the object locations before the image is rotated.   Bounding box information is returned in the FaceRecords array. You can get the version of the face detection model by calling DescribeCollection.
        public let orientationCorrection: OrientationCorrection?
        /// An array of faces that were detected in the image but weren't indexed. They weren't indexed because the quality filter identified them as low quality, or the MaxFaces request parameter filtered them out. To use the quality filter, you specify the QualityFilter request parameter.
        public let unindexedFaces: [UnindexedFace]?

        @inlinable
        public init(faceModelVersion: String? = nil, faceRecords: [FaceRecord]? = nil, orientationCorrection: OrientationCorrection? = nil, unindexedFaces: [UnindexedFace]? = nil) {
            self.faceModelVersion = faceModelVersion
            self.faceRecords = faceRecords
            self.orientationCorrection = orientationCorrection
            self.unindexedFaces = unindexedFaces
        }

        private enum CodingKeys: String, CodingKey {
            case faceModelVersion = "FaceModelVersion"
            case faceRecords = "FaceRecords"
            case orientationCorrection = "OrientationCorrection"
            case unindexedFaces = "UnindexedFaces"
        }
    }

    public struct Instance: AWSDecodableShape {
        /// The position of the label instance on the image.
        public let boundingBox: BoundingBox?
        /// The confidence that Amazon Rekognition has in the accuracy of the bounding box.
        public let confidence: Float?
        /// The dominant colors found in an individual instance of a label.
        public let dominantColors: [DominantColor]?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, confidence: Float? = nil, dominantColors: [DominantColor]? = nil) {
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.dominantColors = dominantColors
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case dominantColors = "DominantColors"
        }
    }

    public struct InternalServerError: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct InvalidImageFormatException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct InvalidManifestException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct InvalidPaginationTokenException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct InvalidParameterException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct InvalidPolicyRevisionIdException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct InvalidS3ObjectException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct KinesisDataStream: AWSEncodableShape & AWSDecodableShape {
        /// ARN of the output Amazon Kinesis Data Streams stream.
        public let arn: String?

        @inlinable
        public init(arn: String? = nil) {
            self.arn = arn
        }

        public func validate(name: String) throws {
            try self.validate(self.arn, name: "arn", parent: name, pattern: "^(^arn:([a-z\\d-]+):kinesis:([a-z\\d-]+):\\d{12}:.+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct KinesisVideoStream: AWSEncodableShape & AWSDecodableShape {
        /// ARN of the Kinesis video stream stream that streams the source video.
        public let arn: String?

        @inlinable
        public init(arn: String? = nil) {
            self.arn = arn
        }

        public func validate(name: String) throws {
            try self.validate(self.arn, name: "arn", parent: name, pattern: "^(^arn:([a-z\\d-]+):kinesisvideo:([a-z\\d-]+):\\d{12}:.+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "Arn"
        }
    }

    public struct KinesisVideoStreamStartSelector: AWSEncodableShape {
        ///  The unique identifier of the fragment. This value monotonically increases based on the ingestion order.
        public let fragmentNumber: String?
        ///  The timestamp from the producer corresponding to the fragment, in milliseconds, expressed in unix time format.
        public let producerTimestamp: Int64?

        @inlinable
        public init(fragmentNumber: String? = nil, producerTimestamp: Int64? = nil) {
            self.fragmentNumber = fragmentNumber
            self.producerTimestamp = producerTimestamp
        }

        public func validate(name: String) throws {
            try self.validate(self.fragmentNumber, name: "fragmentNumber", parent: name, max: 128)
            try self.validate(self.fragmentNumber, name: "fragmentNumber", parent: name, min: 1)
            try self.validate(self.fragmentNumber, name: "fragmentNumber", parent: name, pattern: "^[0-9]+$")
            try self.validate(self.producerTimestamp, name: "producerTimestamp", parent: name, min: 0)
        }

        private enum CodingKeys: String, CodingKey {
            case fragmentNumber = "FragmentNumber"
            case producerTimestamp = "ProducerTimestamp"
        }
    }

    public struct KnownGender: AWSDecodableShape {
        /// A string value of the KnownGender info about the Celebrity.
        public let type: KnownGenderType?

        @inlinable
        public init(type: KnownGenderType? = nil) {
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case type = "Type"
        }
    }

    public struct Label: AWSDecodableShape {
        /// A list of potential aliases for a given label.
        public let aliases: [LabelAlias]?
        /// A list of the categories associated with a given label.
        public let categories: [LabelCategory]?
        /// Level of confidence.
        public let confidence: Float?
        /// If Label represents an object, Instances contains the bounding boxes for each instance of the detected object. Bounding boxes are returned for common object labels such as people, cars, furniture, apparel or pets.
        public let instances: [Instance]?
        /// The name (label) of the object or scene.
        public let name: String?
        /// The parent labels for a label. The response includes all ancestor labels.
        public let parents: [Parent]?

        @inlinable
        public init(aliases: [LabelAlias]? = nil, categories: [LabelCategory]? = nil, confidence: Float? = nil, instances: [Instance]? = nil, name: String? = nil, parents: [Parent]? = nil) {
            self.aliases = aliases
            self.categories = categories
            self.confidence = confidence
            self.instances = instances
            self.name = name
            self.parents = parents
        }

        private enum CodingKeys: String, CodingKey {
            case aliases = "Aliases"
            case categories = "Categories"
            case confidence = "Confidence"
            case instances = "Instances"
            case name = "Name"
            case parents = "Parents"
        }
    }

    public struct LabelAlias: AWSDecodableShape {
        /// The name of an alias for a given label.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct LabelCategory: AWSDecodableShape {
        /// The name of a category that applies to a given label.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct LabelDetection: AWSDecodableShape {
        /// The time duration of a segment in milliseconds, I.e. time elapsed from StartTimestampMillis to EndTimestampMillis.
        public let durationMillis: Int64?
        /// The time in milliseconds defining the end of the timeline segment containing a continuously detected label.
        public let endTimestampMillis: Int64?
        /// Details about the detected label.
        public let label: Label?
        /// The time in milliseconds defining the start of the timeline segment containing a continuously detected label.
        public let startTimestampMillis: Int64?
        /// Time, in milliseconds from the start of the video, that the label was detected. Note that Timestamp is not guaranteed to be accurate to the individual frame where the label first appears.
        public let timestamp: Int64?

        @inlinable
        public init(durationMillis: Int64? = nil, endTimestampMillis: Int64? = nil, label: Label? = nil, startTimestampMillis: Int64? = nil, timestamp: Int64? = nil) {
            self.durationMillis = durationMillis
            self.endTimestampMillis = endTimestampMillis
            self.label = label
            self.startTimestampMillis = startTimestampMillis
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case durationMillis = "DurationMillis"
            case endTimestampMillis = "EndTimestampMillis"
            case label = "Label"
            case startTimestampMillis = "StartTimestampMillis"
            case timestamp = "Timestamp"
        }
    }

    public struct LabelDetectionSettings: AWSEncodableShape {
        public let generalLabels: GeneralLabelsSettings?

        @inlinable
        public init(generalLabels: GeneralLabelsSettings? = nil) {
            self.generalLabels = generalLabels
        }

        public func validate(name: String) throws {
            try self.generalLabels?.validate(name: "\(name).generalLabels")
        }

        private enum CodingKeys: String, CodingKey {
            case generalLabels = "GeneralLabels"
        }
    }

    public struct Landmark: AWSDecodableShape {
        /// Type of landmark.
        public let type: LandmarkType?
        /// The x-coordinate of the landmark expressed as a ratio of the width of the image. The x-coordinate is measured from the left-side of the image. For example, if the image is 700 pixels wide and the x-coordinate of the landmark is at 350 pixels, this value is 0.5.
        public let x: Float?
        /// The y-coordinate of the landmark expressed as a ratio of the height of the image. The y-coordinate is measured from the top of the image. For example, if the image height is 200 pixels and the y-coordinate of the landmark is at 50 pixels, this value is 0.25.
        public let y: Float?

        @inlinable
        public init(type: LandmarkType? = nil, x: Float? = nil, y: Float? = nil) {
            self.type = type
            self.x = x
            self.y = y
        }

        private enum CodingKeys: String, CodingKey {
            case type = "Type"
            case x = "X"
            case y = "Y"
        }
    }

    public struct LimitExceededException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct ListCollectionsRequest: AWSEncodableShape {
        /// Maximum number of collection IDs to return.
        public let maxResults: Int?
        /// Pagination token from the previous response.
        public let nextToken: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 4096)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListCollectionsResponse: AWSDecodableShape {
        /// An array of collection IDs.
        public let collectionIds: [String]?
        /// Version numbers of the face detection models associated with the collections in the array CollectionIds. For example, the value of FaceModelVersions[2] is the version number for the face detection model used by the collection in CollectionId[2].
        public let faceModelVersions: [String]?
        /// If the result is truncated, the response provides a NextToken that you can use in the subsequent request to fetch the next set of collection IDs.
        public let nextToken: String?

        @inlinable
        public init(collectionIds: [String]? = nil, faceModelVersions: [String]? = nil, nextToken: String? = nil) {
            self.collectionIds = collectionIds
            self.faceModelVersions = faceModelVersions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case collectionIds = "CollectionIds"
            case faceModelVersions = "FaceModelVersions"
            case nextToken = "NextToken"
        }
    }

    public struct ListDatasetEntriesRequest: AWSEncodableShape {
        /// Specifies a label filter for the response. The response includes an entry only if one or more of the labels in ContainsLabels exist in the entry.
        public let containsLabels: [String]?
        /// The Amazon Resource Name (ARN) for the dataset that you want to use.
        public let datasetArn: String
        /// Specifies an error filter for the response. Specify True to only include entries that have errors.
        public let hasErrors: Bool?
        ///  Specify true to get only the JSON Lines where the image is labeled.  Specify false to get only the JSON Lines where the image isn't labeled. If you don't specify Labeled, ListDatasetEntries returns JSON Lines for labeled and unlabeled  images.
        public let labeled: Bool?
        /// The maximum number of results to return per paginated call. The largest value you can specify is 100.  If you specify a value greater than 100, a ValidationException error occurs. The default value is 100.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition Custom Labels returns a pagination token in the response. You can use this pagination  token to retrieve the next set of results.
        public let nextToken: String?
        /// If specified, ListDatasetEntries only returns JSON Lines where the value of SourceRefContains is part of the source-ref field. The source-ref field contains the Amazon S3 location of the image. You can use SouceRefContains for tasks such as getting the JSON Line for a single image, or gettting JSON Lines for all images within a specific folder.
        public let sourceRefContains: String?

        @inlinable
        public init(containsLabels: [String]? = nil, datasetArn: String, hasErrors: Bool? = nil, labeled: Bool? = nil, maxResults: Int? = nil, nextToken: String? = nil, sourceRefContains: String? = nil) {
            self.containsLabels = containsLabels
            self.datasetArn = datasetArn
            self.hasErrors = hasErrors
            self.labeled = labeled
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.sourceRefContains = sourceRefContains
        }

        public func validate(name: String) throws {
            try self.containsLabels?.forEach {
                try validate($0, name: "containsLabels[]", parent: name, max: 255)
                try validate($0, name: "containsLabels[]", parent: name, min: 1)
                try validate($0, name: "containsLabels[]", parent: name, pattern: "^.{1,}$")
            }
            try self.validate(self.containsLabels, name: "containsLabels", parent: name, max: 10)
            try self.validate(self.containsLabels, name: "containsLabels", parent: name, min: 1)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, max: 2048)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, min: 20)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 1024)
            try self.validate(self.sourceRefContains, name: "sourceRefContains", parent: name, max: 2048)
            try self.validate(self.sourceRefContains, name: "sourceRefContains", parent: name, min: 1)
            try self.validate(self.sourceRefContains, name: "sourceRefContains", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case containsLabels = "ContainsLabels"
            case datasetArn = "DatasetArn"
            case hasErrors = "HasErrors"
            case labeled = "Labeled"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case sourceRefContains = "SourceRefContains"
        }
    }

    public struct ListDatasetEntriesResponse: AWSDecodableShape {
        /// A list of entries (images) in the dataset.
        public let datasetEntries: [String]?
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition Custom Labels returns a pagination token in the response. You can use this pagination  token to retrieve the next set of results.
        public let nextToken: String?

        @inlinable
        public init(datasetEntries: [String]? = nil, nextToken: String? = nil) {
            self.datasetEntries = datasetEntries
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case datasetEntries = "DatasetEntries"
            case nextToken = "NextToken"
        }
    }

    public struct ListDatasetLabelsRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the dataset that you want to use.
        public let datasetArn: String
        /// The maximum number of results to return per paginated call. The largest value you can specify is 100.  If you specify a value greater than 100, a ValidationException error occurs. The default value is 100.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition Custom Labels returns a pagination token in the response. You can use this pagination  token to retrieve the next set of results.
        public let nextToken: String?

        @inlinable
        public init(datasetArn: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.datasetArn = datasetArn
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, max: 2048)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, min: 20)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case datasetArn = "DatasetArn"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListDatasetLabelsResponse: AWSDecodableShape {
        /// A list of the labels in the dataset.
        public let datasetLabelDescriptions: [DatasetLabelDescription]?
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition Custom Labels returns a pagination token in the response. You can use this pagination  token to retrieve the next set of results.
        public let nextToken: String?

        @inlinable
        public init(datasetLabelDescriptions: [DatasetLabelDescription]? = nil, nextToken: String? = nil) {
            self.datasetLabelDescriptions = datasetLabelDescriptions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case datasetLabelDescriptions = "DatasetLabelDescriptions"
            case nextToken = "NextToken"
        }
    }

    public struct ListFacesRequest: AWSEncodableShape {
        /// ID of the collection from which to list the faces.
        public let collectionId: String
        /// An array of face IDs to filter results with when listing faces in a collection.
        public let faceIds: [String]?
        /// Maximum number of faces to return.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more data to retrieve), Amazon Rekognition returns a pagination token in the response. You can use this pagination token to retrieve the next set of faces.
        public let nextToken: String?
        /// An array of user IDs to filter results with when listing faces in a collection.
        public let userId: String?

        @inlinable
        public init(collectionId: String, faceIds: [String]? = nil, maxResults: Int? = nil, nextToken: String? = nil, userId: String? = nil) {
            self.collectionId = collectionId
            self.faceIds = faceIds
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.userId = userId
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.faceIds?.forEach {
                try validate($0, name: "faceIds[]", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
            }
            try self.validate(self.faceIds, name: "faceIds", parent: name, max: 4096)
            try self.validate(self.faceIds, name: "faceIds", parent: name, min: 1)
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 4096)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 0)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
            try self.validate(self.userId, name: "userId", parent: name, max: 128)
            try self.validate(self.userId, name: "userId", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case faceIds = "FaceIds"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case userId = "UserId"
        }
    }

    public struct ListFacesResponse: AWSDecodableShape {
        /// Version number of the face detection model associated with the input collection (CollectionId).
        public let faceModelVersion: String?
        /// An array of Face objects.
        public let faces: [Face]?
        /// If the response is truncated, Amazon Rekognition returns this token that you can use in the subsequent request to retrieve the next set of faces.
        public let nextToken: String?

        @inlinable
        public init(faceModelVersion: String? = nil, faces: [Face]? = nil, nextToken: String? = nil) {
            self.faceModelVersion = faceModelVersion
            self.faces = faces
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case faceModelVersion = "FaceModelVersion"
            case faces = "Faces"
            case nextToken = "NextToken"
        }
    }

    public struct ListMediaAnalysisJobsRequest: AWSEncodableShape {
        /// The maximum number of results to return per paginated call. The largest value user can specify is 100.  If user specifies a value greater than 100, an InvalidParameterException error occurs. The default value is 100.
        public let maxResults: Int?
        /// Pagination token, if the previous response was incomplete.
        public let nextToken: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 100)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListMediaAnalysisJobsResponse: AWSDecodableShape {
        /// Contains a list of all media analysis jobs.
        public let mediaAnalysisJobs: [MediaAnalysisJobDescription]
        /// Pagination token, if the previous response was incomplete.
        public let nextToken: String?

        @inlinable
        public init(mediaAnalysisJobs: [MediaAnalysisJobDescription], nextToken: String? = nil) {
            self.mediaAnalysisJobs = mediaAnalysisJobs
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case mediaAnalysisJobs = "MediaAnalysisJobs"
            case nextToken = "NextToken"
        }
    }

    public struct ListProjectPoliciesRequest: AWSEncodableShape {
        /// The maximum number of results to return per paginated call. The largest value you can specify is 5. If you specify a value greater than 5, a ValidationException error occurs. The default value is 5.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there is more results to retrieve), Amazon Rekognition Custom Labels returns a pagination token in the response. You can use this pagination token to retrieve the next set of results.
        public let nextToken: String?
        /// The ARN of the project for which you want to list the project policies.
        public let projectArn: String

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil, projectArn: String) {
            self.maxResults = maxResults
            self.nextToken = nextToken
            self.projectArn = projectArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 5)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 1024)
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
            case projectArn = "ProjectArn"
        }
    }

    public struct ListProjectPoliciesResponse: AWSDecodableShape {
        /// If the response is truncated, Amazon Rekognition returns this token that you can use in the subsequent request to retrieve the next set of project policies.
        public let nextToken: String?
        /// A list of project policies attached to the project.
        public let projectPolicies: [ProjectPolicy]?

        @inlinable
        public init(nextToken: String? = nil, projectPolicies: [ProjectPolicy]? = nil) {
            self.nextToken = nextToken
            self.projectPolicies = projectPolicies
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case projectPolicies = "ProjectPolicies"
        }
    }

    public struct ListStreamProcessorsRequest: AWSEncodableShape {
        /// Maximum number of stream processors you want Amazon Rekognition Video to return in the response. The default is 1000.
        public let maxResults: Int?
        /// If the previous response was incomplete (because there are more stream processors to retrieve), Amazon Rekognition Video returns a pagination token in the response. You can use this pagination token to retrieve the next set of stream processors.
        public let nextToken: String?

        @inlinable
        public init(maxResults: Int? = nil, nextToken: String? = nil) {
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListStreamProcessorsResponse: AWSDecodableShape {
        /// If the response is truncated, Amazon Rekognition Video returns this token that you can use in the subsequent request to retrieve the next set of stream processors.
        public let nextToken: String?
        /// List of stream processors that you have created.
        public let streamProcessors: [StreamProcessor]?

        @inlinable
        public init(nextToken: String? = nil, streamProcessors: [StreamProcessor]? = nil) {
            self.nextToken = nextToken
            self.streamProcessors = streamProcessors
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case streamProcessors = "StreamProcessors"
        }
    }

    public struct ListTagsForResourceRequest: AWSEncodableShape {
        ///  Amazon Resource Name (ARN) of the model, collection, or stream processor that contains the tags that you want a list of.
        public let resourceArn: String

        @inlinable
        public init(resourceArn: String) {
            self.resourceArn = resourceArn
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
        }
    }

    public struct ListTagsForResourceResponse: AWSDecodableShape {
        ///  A list of key-value tags assigned to the resource.
        public let tags: [String: String]?

        @inlinable
        public init(tags: [String: String]? = nil) {
            self.tags = tags
        }

        private enum CodingKeys: String, CodingKey {
            case tags = "Tags"
        }
    }

    public struct ListUsersRequest: AWSEncodableShape {
        /// The ID of an existing collection.
        public let collectionId: String
        /// Maximum number of UsersID to return.
        public let maxResults: Int?
        /// Pagingation token to receive the next set of UsersID.
        public let nextToken: String?

        @inlinable
        public init(collectionId: String, maxResults: Int? = nil, nextToken: String? = nil) {
            self.collectionId = collectionId
            self.maxResults = maxResults
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.maxResults, name: "maxResults", parent: name, max: 500)
            try self.validate(self.maxResults, name: "maxResults", parent: name, min: 1)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 255)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case maxResults = "MaxResults"
            case nextToken = "NextToken"
        }
    }

    public struct ListUsersResponse: AWSDecodableShape {
        /// A pagination token to be used with the subsequent request if the response is truncated.
        public let nextToken: String?
        /// List of UsersID associated with the specified collection.
        public let users: [User]?

        @inlinable
        public init(nextToken: String? = nil, users: [User]? = nil) {
            self.nextToken = nextToken
            self.users = users
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case users = "Users"
        }
    }

    public struct LivenessOutputConfig: AWSEncodableShape {
        /// The path to an AWS Amazon S3 bucket used to store Face Liveness session results.
        public let s3Bucket: String
        /// The prefix prepended to the output files for the Face Liveness session results.
        public let s3KeyPrefix: String?

        @inlinable
        public init(s3Bucket: String, s3KeyPrefix: String? = nil) {
            self.s3Bucket = s3Bucket
            self.s3KeyPrefix = s3KeyPrefix
        }

        public func validate(name: String) throws {
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, max: 255)
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, min: 3)
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, pattern: "^[0-9A-Za-z\\.\\-_]*$")
            try self.validate(self.s3KeyPrefix, name: "s3KeyPrefix", parent: name, max: 950)
            try self.validate(self.s3KeyPrefix, name: "s3KeyPrefix", parent: name, pattern: "^\\S*$")
        }

        private enum CodingKeys: String, CodingKey {
            case s3Bucket = "S3Bucket"
            case s3KeyPrefix = "S3KeyPrefix"
        }
    }

    public struct MalformedPolicyDocumentException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct MatchedUser: AWSDecodableShape {
        /// A provided ID for the UserID. Unique within the collection.
        public let userId: String?
        /// The status of the user matched to a provided FaceID.
        public let userStatus: UserStatus?

        @inlinable
        public init(userId: String? = nil, userStatus: UserStatus? = nil) {
            self.userId = userId
            self.userStatus = userStatus
        }

        private enum CodingKeys: String, CodingKey {
            case userId = "UserId"
            case userStatus = "UserStatus"
        }
    }

    public struct MediaAnalysisDetectModerationLabelsConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the minimum confidence level for the moderation labels to return. Amazon Rekognition doesn't return any labels with a confidence level lower than this specified value.
        public let minConfidence: Float?
        /// Specifies the custom moderation model to be used during the label detection job.  If not provided the pre-trained model is used.
        public let projectVersion: String?

        @inlinable
        public init(minConfidence: Float? = nil, projectVersion: String? = nil) {
            self.minConfidence = minConfidence
            self.projectVersion = projectVersion
        }

        public func validate(name: String) throws {
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
            try self.validate(self.projectVersion, name: "projectVersion", parent: name, max: 2048)
            try self.validate(self.projectVersion, name: "projectVersion", parent: name, min: 20)
            try self.validate(self.projectVersion, name: "projectVersion", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case minConfidence = "MinConfidence"
            case projectVersion = "ProjectVersion"
        }
    }

    public struct MediaAnalysisInput: AWSEncodableShape & AWSDecodableShape {
        public let s3Object: S3Object

        @inlinable
        public init(s3Object: S3Object) {
            self.s3Object = s3Object
        }

        public func validate(name: String) throws {
            try self.s3Object.validate(name: "\(name).s3Object")
        }

        private enum CodingKeys: String, CodingKey {
            case s3Object = "S3Object"
        }
    }

    public struct MediaAnalysisJobDescription: AWSDecodableShape {
        /// The Unix date and time when the job finished.
        public let completionTimestamp: Date?
        /// The Unix date and time when the job was started.
        public let creationTimestamp: Date
        /// Details about the error that resulted in failure of the job.
        public let failureDetails: MediaAnalysisJobFailureDetails?
        /// Reference to the input manifest that was provided in the job creation request.
        public let input: MediaAnalysisInput
        /// The identifier for a media analysis job.
        public let jobId: String
        /// The name of a media analysis job.
        public let jobName: String?
        /// KMS Key that was provided in the creation request.
        public let kmsKeyId: String?
        /// Provides statistics on input manifest and errors identified in the input manifest.
        public let manifestSummary: MediaAnalysisManifestSummary?
        /// Operation configurations that were provided during job creation.
        public let operationsConfig: MediaAnalysisOperationsConfig
        /// Output configuration that was provided in the creation request.
        public let outputConfig: MediaAnalysisOutputConfig
        /// Output manifest that contains prediction results.
        public let results: MediaAnalysisResults?
        /// The status of the media analysis job being retrieved.
        public let status: MediaAnalysisJobStatus

        @inlinable
        public init(completionTimestamp: Date? = nil, creationTimestamp: Date, failureDetails: MediaAnalysisJobFailureDetails? = nil, input: MediaAnalysisInput, jobId: String, jobName: String? = nil, kmsKeyId: String? = nil, manifestSummary: MediaAnalysisManifestSummary? = nil, operationsConfig: MediaAnalysisOperationsConfig, outputConfig: MediaAnalysisOutputConfig, results: MediaAnalysisResults? = nil, status: MediaAnalysisJobStatus) {
            self.completionTimestamp = completionTimestamp
            self.creationTimestamp = creationTimestamp
            self.failureDetails = failureDetails
            self.input = input
            self.jobId = jobId
            self.jobName = jobName
            self.kmsKeyId = kmsKeyId
            self.manifestSummary = manifestSummary
            self.operationsConfig = operationsConfig
            self.outputConfig = outputConfig
            self.results = results
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case completionTimestamp = "CompletionTimestamp"
            case creationTimestamp = "CreationTimestamp"
            case failureDetails = "FailureDetails"
            case input = "Input"
            case jobId = "JobId"
            case jobName = "JobName"
            case kmsKeyId = "KmsKeyId"
            case manifestSummary = "ManifestSummary"
            case operationsConfig = "OperationsConfig"
            case outputConfig = "OutputConfig"
            case results = "Results"
            case status = "Status"
        }
    }

    public struct MediaAnalysisJobFailureDetails: AWSDecodableShape {
        /// Error code for the failed job.
        public let code: MediaAnalysisJobFailureCode?
        /// Human readable error message.
        public let message: String?

        @inlinable
        public init(code: MediaAnalysisJobFailureCode? = nil, message: String? = nil) {
            self.code = code
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case message = "Message"
        }
    }

    public struct MediaAnalysisManifestSummary: AWSDecodableShape {
        public let s3Object: S3Object?

        @inlinable
        public init(s3Object: S3Object? = nil) {
            self.s3Object = s3Object
        }

        private enum CodingKeys: String, CodingKey {
            case s3Object = "S3Object"
        }
    }

    public struct MediaAnalysisModelVersions: AWSDecodableShape {
        /// The Moderation base model version.
        public let moderation: String?

        @inlinable
        public init(moderation: String? = nil) {
            self.moderation = moderation
        }

        private enum CodingKeys: String, CodingKey {
            case moderation = "Moderation"
        }
    }

    public struct MediaAnalysisOperationsConfig: AWSEncodableShape & AWSDecodableShape {
        /// Contains configuration options for a DetectModerationLabels job.
        public let detectModerationLabels: MediaAnalysisDetectModerationLabelsConfig?

        @inlinable
        public init(detectModerationLabels: MediaAnalysisDetectModerationLabelsConfig? = nil) {
            self.detectModerationLabels = detectModerationLabels
        }

        public func validate(name: String) throws {
            try self.detectModerationLabels?.validate(name: "\(name).detectModerationLabels")
        }

        private enum CodingKeys: String, CodingKey {
            case detectModerationLabels = "DetectModerationLabels"
        }
    }

    public struct MediaAnalysisOutputConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specifies the Amazon S3 bucket to contain the output of the media analysis job.
        public let s3Bucket: String
        /// Specifies the Amazon S3 key prefix that comes after the name of the bucket you have designated for storage.
        public let s3KeyPrefix: String?

        @inlinable
        public init(s3Bucket: String, s3KeyPrefix: String? = nil) {
            self.s3Bucket = s3Bucket
            self.s3KeyPrefix = s3KeyPrefix
        }

        public func validate(name: String) throws {
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, max: 255)
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, min: 3)
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, pattern: "^[0-9A-Za-z\\.\\-_]*$")
            try self.validate(self.s3KeyPrefix, name: "s3KeyPrefix", parent: name, max: 800)
            try self.validate(self.s3KeyPrefix, name: "s3KeyPrefix", parent: name, pattern: "^\\S*$")
        }

        private enum CodingKeys: String, CodingKey {
            case s3Bucket = "S3Bucket"
            case s3KeyPrefix = "S3KeyPrefix"
        }
    }

    public struct MediaAnalysisResults: AWSDecodableShape {
        /// Information about the model versions for the features selected in a given job.
        public let modelVersions: MediaAnalysisModelVersions?
        public let s3Object: S3Object?

        @inlinable
        public init(modelVersions: MediaAnalysisModelVersions? = nil, s3Object: S3Object? = nil) {
            self.modelVersions = modelVersions
            self.s3Object = s3Object
        }

        private enum CodingKeys: String, CodingKey {
            case modelVersions = "ModelVersions"
            case s3Object = "S3Object"
        }
    }

    public struct ModerationLabel: AWSDecodableShape {
        /// Specifies the confidence that Amazon Rekognition has that the label has been correctly identified. If you don't specify the MinConfidence parameter in the call to DetectModerationLabels, the operation returns labels with a confidence value greater than or equal to 50 percent.
        public let confidence: Float?
        /// The label name for the type of unsafe content detected in the image.
        public let name: String?
        /// The name for the parent label. Labels at the top level of the hierarchy have the parent label "".
        public let parentName: String?
        /// The level of the moderation label with regard to its taxonomy, from 1 to 3.
        public let taxonomyLevel: Int?

        @inlinable
        public init(confidence: Float? = nil, name: String? = nil, parentName: String? = nil, taxonomyLevel: Int? = nil) {
            self.confidence = confidence
            self.name = name
            self.parentName = parentName
            self.taxonomyLevel = taxonomyLevel
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case name = "Name"
            case parentName = "ParentName"
            case taxonomyLevel = "TaxonomyLevel"
        }
    }

    public struct MouthOpen: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the mouth on the face is open or not.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct Mustache: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the face has mustache or not.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct NotificationChannel: AWSEncodableShape {
        /// The ARN of an IAM role that gives Amazon Rekognition publishing permissions to the Amazon SNS topic.
        public let roleArn: String
        /// The Amazon SNS topic to which Amazon Rekognition posts the completion status.
        public let snsTopicArn: String

        @inlinable
        public init(roleArn: String, snsTopicArn: String) {
            self.roleArn = roleArn
            self.snsTopicArn = snsTopicArn
        }

        public func validate(name: String) throws {
            try self.validate(self.roleArn, name: "roleArn", parent: name, pattern: "^arn:aws:iam::\\d{12}:role/?[a-zA-Z_0-9+=,.@\\-_/]+$")
            try self.validate(self.snsTopicArn, name: "snsTopicArn", parent: name, pattern: "^(^arn:aws:sns:.*:\\w{12}:.+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case roleArn = "RoleArn"
            case snsTopicArn = "SNSTopicArn"
        }
    }

    public struct OutputConfig: AWSEncodableShape & AWSDecodableShape {
        /// The S3 bucket where training output is placed.
        public let s3Bucket: String?
        /// The prefix applied to the training output files.
        public let s3KeyPrefix: String?

        @inlinable
        public init(s3Bucket: String? = nil, s3KeyPrefix: String? = nil) {
            self.s3Bucket = s3Bucket
            self.s3KeyPrefix = s3KeyPrefix
        }

        public func validate(name: String) throws {
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, max: 255)
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, min: 3)
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, pattern: "^[0-9A-Za-z\\.\\-_]*$")
            try self.validate(self.s3KeyPrefix, name: "s3KeyPrefix", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case s3Bucket = "S3Bucket"
            case s3KeyPrefix = "S3KeyPrefix"
        }
    }

    public struct Parent: AWSDecodableShape {
        /// The name of the parent label.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct PersonDetail: AWSDecodableShape {
        /// Bounding box around the detected person.
        public let boundingBox: BoundingBox?
        /// Face details for the detected person.
        public let face: FaceDetail?
        /// Identifier for the person detected person within a video. Use to keep track of the person throughout the video. The identifier is not stored by Amazon Rekognition.
        public let index: Int64?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, face: FaceDetail? = nil, index: Int64? = nil) {
            self.boundingBox = boundingBox
            self.face = face
            self.index = index
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case face = "Face"
            case index = "Index"
        }
    }

    public struct PersonDetection: AWSDecodableShape {
        /// Details about a person whose path was tracked in a video.
        public let person: PersonDetail?
        /// The time, in milliseconds from the start of the video, that the person's path was tracked. Note that Timestamp is not guaranteed to be accurate to the individual frame where the person's path first appears.
        public let timestamp: Int64?

        @inlinable
        public init(person: PersonDetail? = nil, timestamp: Int64? = nil) {
            self.person = person
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case person = "Person"
            case timestamp = "Timestamp"
        }
    }

    public struct PersonMatch: AWSDecodableShape {
        /// Information about the faces in the input collection that match the face of a person in the video.
        public let faceMatches: [FaceMatch]?
        /// Information about the matched person.
        public let person: PersonDetail?
        /// The time, in milliseconds from the beginning of the video, that the person was matched in the video.
        public let timestamp: Int64?

        @inlinable
        public init(faceMatches: [FaceMatch]? = nil, person: PersonDetail? = nil, timestamp: Int64? = nil) {
            self.faceMatches = faceMatches
            self.person = person
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case faceMatches = "FaceMatches"
            case person = "Person"
            case timestamp = "Timestamp"
        }
    }

    public struct Point: AWSEncodableShape & AWSDecodableShape {
        /// The value of the X coordinate for a point on a Polygon.
        public let x: Float?
        /// The value of the Y coordinate for a point on a Polygon.
        public let y: Float?

        @inlinable
        public init(x: Float? = nil, y: Float? = nil) {
            self.x = x
            self.y = y
        }

        private enum CodingKeys: String, CodingKey {
            case x = "X"
            case y = "Y"
        }
    }

    public struct Pose: AWSDecodableShape {
        /// Value representing the face rotation on the pitch axis.
        public let pitch: Float?
        /// Value representing the face rotation on the roll axis.
        public let roll: Float?
        /// Value representing the face rotation on the yaw axis.
        public let yaw: Float?

        @inlinable
        public init(pitch: Float? = nil, roll: Float? = nil, yaw: Float? = nil) {
            self.pitch = pitch
            self.roll = roll
            self.yaw = yaw
        }

        private enum CodingKeys: String, CodingKey {
            case pitch = "Pitch"
            case roll = "Roll"
            case yaw = "Yaw"
        }
    }

    public struct ProjectDescription: AWSDecodableShape {
        /// Indicates whether automatic retraining will be attempted for the versions of the project. Applies only to adapters.
        public let autoUpdate: ProjectAutoUpdate?
        /// The Unix timestamp for the date and time that the project was created.
        public let creationTimestamp: Date?
        ///  Information about the training and test datasets in the project.
        public let datasets: [DatasetMetadata]?
        /// Specifies the project that is being customized.
        public let feature: CustomizationFeature?
        /// The Amazon Resource Name (ARN) of the project.
        public let projectArn: String?
        /// The current status of the project.
        public let status: ProjectStatus?

        @inlinable
        public init(autoUpdate: ProjectAutoUpdate? = nil, creationTimestamp: Date? = nil, datasets: [DatasetMetadata]? = nil, feature: CustomizationFeature? = nil, projectArn: String? = nil, status: ProjectStatus? = nil) {
            self.autoUpdate = autoUpdate
            self.creationTimestamp = creationTimestamp
            self.datasets = datasets
            self.feature = feature
            self.projectArn = projectArn
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case autoUpdate = "AutoUpdate"
            case creationTimestamp = "CreationTimestamp"
            case datasets = "Datasets"
            case feature = "Feature"
            case projectArn = "ProjectArn"
            case status = "Status"
        }
    }

    public struct ProjectPolicy: AWSDecodableShape {
        /// The Unix datetime for the creation of the project policy.
        public let creationTimestamp: Date?
        /// The Unix datetime for when the project policy was last updated.
        public let lastUpdatedTimestamp: Date?
        /// The JSON document for the project policy.
        public let policyDocument: String?
        /// The name of the project policy.
        public let policyName: String?
        /// The revision ID of the project policy.
        public let policyRevisionId: String?
        /// The Amazon Resource Name (ARN) of the project to which the project policy is attached.
        public let projectArn: String?

        @inlinable
        public init(creationTimestamp: Date? = nil, lastUpdatedTimestamp: Date? = nil, policyDocument: String? = nil, policyName: String? = nil, policyRevisionId: String? = nil, projectArn: String? = nil) {
            self.creationTimestamp = creationTimestamp
            self.lastUpdatedTimestamp = lastUpdatedTimestamp
            self.policyDocument = policyDocument
            self.policyName = policyName
            self.policyRevisionId = policyRevisionId
            self.projectArn = projectArn
        }

        private enum CodingKeys: String, CodingKey {
            case creationTimestamp = "CreationTimestamp"
            case lastUpdatedTimestamp = "LastUpdatedTimestamp"
            case policyDocument = "PolicyDocument"
            case policyName = "PolicyName"
            case policyRevisionId = "PolicyRevisionId"
            case projectArn = "ProjectArn"
        }
    }

    public struct ProjectVersionDescription: AWSDecodableShape {
        /// The base detection model version used to create the project version.
        public let baseModelVersion: String?
        /// The duration, in seconds, that you were billed for a successful training of the model version.  This value is only returned if the model version has been successfully trained.
        public let billableTrainingTimeInSeconds: Int64?
        /// The Unix datetime for the date and time that training started.
        public let creationTimestamp: Date?
        /// The training results. EvaluationResult is only returned if training is successful.
        public let evaluationResult: EvaluationResult?
        /// The feature that was customized.
        public let feature: CustomizationFeature?
        /// Feature specific configuration that was applied during training.
        public let featureConfig: CustomizationFeatureConfig?
        /// The identifer for the AWS Key Management Service key (AWS KMS key) that was used to encrypt the model during training.
        public let kmsKeyId: String?
        /// The location of the summary manifest. The summary manifest provides aggregate data validation results for the training and test datasets.
        public let manifestSummary: GroundTruthManifest?
        /// The maximum number of inference units Amazon Rekognition uses to auto-scale the model. Applies only to Custom Labels projects. For more information, see StartProjectVersion.
        public let maxInferenceUnits: Int?
        /// The minimum number of inference units used by the model. Applies only to Custom Labels projects. For more information, see StartProjectVersion.
        public let minInferenceUnits: Int?
        /// The location where training results are saved.
        public let outputConfig: OutputConfig?
        /// The Amazon Resource Name (ARN) of the project version.
        public let projectVersionArn: String?
        /// If the model version was copied from a different project, SourceProjectVersionArn contains the ARN of the source model version.
        public let sourceProjectVersionArn: String?
        /// The current status of the model version.
        public let status: ProjectVersionStatus?
        /// A descriptive message for an error or warning that occurred.
        public let statusMessage: String?
        /// Contains information about the testing results.
        public let testingDataResult: TestingDataResult?
        /// Contains information about the training results.
        public let trainingDataResult: TrainingDataResult?
        /// The Unix date and time that training of the model ended.
        public let trainingEndTimestamp: Date?
        /// A user-provided description of the project version.
        public let versionDescription: String?

        @inlinable
        public init(baseModelVersion: String? = nil, billableTrainingTimeInSeconds: Int64? = nil, creationTimestamp: Date? = nil, evaluationResult: EvaluationResult? = nil, feature: CustomizationFeature? = nil, featureConfig: CustomizationFeatureConfig? = nil, kmsKeyId: String? = nil, manifestSummary: GroundTruthManifest? = nil, maxInferenceUnits: Int? = nil, minInferenceUnits: Int? = nil, outputConfig: OutputConfig? = nil, projectVersionArn: String? = nil, sourceProjectVersionArn: String? = nil, status: ProjectVersionStatus? = nil, statusMessage: String? = nil, testingDataResult: TestingDataResult? = nil, trainingDataResult: TrainingDataResult? = nil, trainingEndTimestamp: Date? = nil, versionDescription: String? = nil) {
            self.baseModelVersion = baseModelVersion
            self.billableTrainingTimeInSeconds = billableTrainingTimeInSeconds
            self.creationTimestamp = creationTimestamp
            self.evaluationResult = evaluationResult
            self.feature = feature
            self.featureConfig = featureConfig
            self.kmsKeyId = kmsKeyId
            self.manifestSummary = manifestSummary
            self.maxInferenceUnits = maxInferenceUnits
            self.minInferenceUnits = minInferenceUnits
            self.outputConfig = outputConfig
            self.projectVersionArn = projectVersionArn
            self.sourceProjectVersionArn = sourceProjectVersionArn
            self.status = status
            self.statusMessage = statusMessage
            self.testingDataResult = testingDataResult
            self.trainingDataResult = trainingDataResult
            self.trainingEndTimestamp = trainingEndTimestamp
            self.versionDescription = versionDescription
        }

        private enum CodingKeys: String, CodingKey {
            case baseModelVersion = "BaseModelVersion"
            case billableTrainingTimeInSeconds = "BillableTrainingTimeInSeconds"
            case creationTimestamp = "CreationTimestamp"
            case evaluationResult = "EvaluationResult"
            case feature = "Feature"
            case featureConfig = "FeatureConfig"
            case kmsKeyId = "KmsKeyId"
            case manifestSummary = "ManifestSummary"
            case maxInferenceUnits = "MaxInferenceUnits"
            case minInferenceUnits = "MinInferenceUnits"
            case outputConfig = "OutputConfig"
            case projectVersionArn = "ProjectVersionArn"
            case sourceProjectVersionArn = "SourceProjectVersionArn"
            case status = "Status"
            case statusMessage = "StatusMessage"
            case testingDataResult = "TestingDataResult"
            case trainingDataResult = "TrainingDataResult"
            case trainingEndTimestamp = "TrainingEndTimestamp"
            case versionDescription = "VersionDescription"
        }
    }

    public struct ProtectiveEquipmentBodyPart: AWSDecodableShape {
        /// The confidence that Amazon Rekognition has in the detection accuracy of the detected body part.
        public let confidence: Float?
        /// An array of Personal Protective Equipment items detected around a body part.
        public let equipmentDetections: [EquipmentDetection]?
        /// The detected body part.
        public let name: BodyPart?

        @inlinable
        public init(confidence: Float? = nil, equipmentDetections: [EquipmentDetection]? = nil, name: BodyPart? = nil) {
            self.confidence = confidence
            self.equipmentDetections = equipmentDetections
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case equipmentDetections = "EquipmentDetections"
            case name = "Name"
        }
    }

    public struct ProtectiveEquipmentPerson: AWSDecodableShape {
        /// An array of body parts detected on a person's body (including body parts without PPE).
        public let bodyParts: [ProtectiveEquipmentBodyPart]?
        /// A bounding box around the detected person.
        public let boundingBox: BoundingBox?
        /// The confidence that Amazon Rekognition has that the bounding box contains a person.
        public let confidence: Float?
        /// The identifier for the detected person. The identifier is only unique for a single call to DetectProtectiveEquipment.
        public let id: Int?

        @inlinable
        public init(bodyParts: [ProtectiveEquipmentBodyPart]? = nil, boundingBox: BoundingBox? = nil, confidence: Float? = nil, id: Int? = nil) {
            self.bodyParts = bodyParts
            self.boundingBox = boundingBox
            self.confidence = confidence
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case bodyParts = "BodyParts"
            case boundingBox = "BoundingBox"
            case confidence = "Confidence"
            case id = "Id"
        }
    }

    public struct ProtectiveEquipmentSummarizationAttributes: AWSEncodableShape {
        /// The minimum confidence level for which you want summary information.  The confidence level applies to person detection, body part detection, equipment detection, and body part coverage. Amazon Rekognition doesn't return summary information with a confidence than this specified value. There isn't a default value. Specify a MinConfidence value that is between 50-100% as DetectProtectiveEquipment returns predictions only where the detection confidence is between 50% - 100%.   If you specify a value that is less than 50%, the results are the same specifying a value of 50%.
        public let minConfidence: Float
        /// An array of personal protective equipment types for which you want summary information.  If a person is detected wearing a required requipment type, the person's ID is added to the PersonsWithRequiredEquipment array field returned in ProtectiveEquipmentSummary by DetectProtectiveEquipment.
        public let requiredEquipmentTypes: [ProtectiveEquipmentType]

        @inlinable
        public init(minConfidence: Float, requiredEquipmentTypes: [ProtectiveEquipmentType]) {
            self.minConfidence = minConfidence
            self.requiredEquipmentTypes = requiredEquipmentTypes
        }

        public func validate(name: String) throws {
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case minConfidence = "MinConfidence"
            case requiredEquipmentTypes = "RequiredEquipmentTypes"
        }
    }

    public struct ProtectiveEquipmentSummary: AWSDecodableShape {
        /// An array of IDs for persons where it was not possible to determine if they are wearing personal protective equipment.
        public let personsIndeterminate: [Int]?
        /// An array of IDs for persons who are not wearing all of the types of PPE specified in the RequiredEquipmentTypes field of the detected personal protective equipment.
        public let personsWithoutRequiredEquipment: [Int]?
        /// An array of IDs for persons who are wearing detected personal protective equipment.
        public let personsWithRequiredEquipment: [Int]?

        @inlinable
        public init(personsIndeterminate: [Int]? = nil, personsWithoutRequiredEquipment: [Int]? = nil, personsWithRequiredEquipment: [Int]? = nil) {
            self.personsIndeterminate = personsIndeterminate
            self.personsWithoutRequiredEquipment = personsWithoutRequiredEquipment
            self.personsWithRequiredEquipment = personsWithRequiredEquipment
        }

        private enum CodingKeys: String, CodingKey {
            case personsIndeterminate = "PersonsIndeterminate"
            case personsWithoutRequiredEquipment = "PersonsWithoutRequiredEquipment"
            case personsWithRequiredEquipment = "PersonsWithRequiredEquipment"
        }
    }

    public struct ProvisionedThroughputExceededException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct PutProjectPolicyRequest: AWSEncodableShape {
        /// A resource policy to add to the model. The policy is a JSON structure that contains one or more statements that define the policy.  The policy must follow the IAM syntax. For more information about the contents of a JSON policy document, see  IAM JSON policy reference.
        public let policyDocument: String
        /// A name for the policy.
        public let policyName: String
        /// The revision ID for the Project Policy. Each time you modify a policy, Amazon Rekognition Custom Labels generates and assigns a new PolicyRevisionId and then deletes the previous version of the policy.
        public let policyRevisionId: String?
        /// The Amazon Resource Name (ARN) of the project that the project policy is attached to.
        public let projectArn: String

        @inlinable
        public init(policyDocument: String, policyName: String, policyRevisionId: String? = nil, projectArn: String) {
            self.policyDocument = policyDocument
            self.policyName = policyName
            self.policyRevisionId = policyRevisionId
            self.projectArn = projectArn
        }

        public func validate(name: String) throws {
            try self.validate(self.policyDocument, name: "policyDocument", parent: name, max: 2000)
            try self.validate(self.policyDocument, name: "policyDocument", parent: name, min: 1)
            try self.validate(self.policyDocument, name: "policyDocument", parent: name, pattern: "^[\\u0009\\u000A\\u000D\\u0020-\\u00FF]+$")
            try self.validate(self.policyName, name: "policyName", parent: name, max: 128)
            try self.validate(self.policyName, name: "policyName", parent: name, min: 1)
            try self.validate(self.policyName, name: "policyName", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.policyRevisionId, name: "policyRevisionId", parent: name, max: 64)
            try self.validate(self.policyRevisionId, name: "policyRevisionId", parent: name, pattern: "^[0-9A-Fa-f]+$")
            try self.validate(self.projectArn, name: "projectArn", parent: name, max: 2048)
            try self.validate(self.projectArn, name: "projectArn", parent: name, min: 20)
            try self.validate(self.projectArn, name: "projectArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case policyDocument = "PolicyDocument"
            case policyName = "PolicyName"
            case policyRevisionId = "PolicyRevisionId"
            case projectArn = "ProjectArn"
        }
    }

    public struct PutProjectPolicyResponse: AWSDecodableShape {
        /// The ID of the project policy.
        public let policyRevisionId: String?

        @inlinable
        public init(policyRevisionId: String? = nil) {
            self.policyRevisionId = policyRevisionId
        }

        private enum CodingKeys: String, CodingKey {
            case policyRevisionId = "PolicyRevisionId"
        }
    }

    public struct RecognizeCelebritiesRequest: AWSEncodableShape {
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes is not supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image

        @inlinable
        public init(image: Image) {
            self.image = image
        }

        public func validate(name: String) throws {
            try self.image.validate(name: "\(name).image")
        }

        private enum CodingKeys: String, CodingKey {
            case image = "Image"
        }
    }

    public struct RecognizeCelebritiesResponse: AWSDecodableShape {
        /// Details about each celebrity found in the image. Amazon Rekognition can detect a maximum of 64 celebrities in an image. Each celebrity object includes the following attributes: Face, Confidence, Emotions, Landmarks, Pose, Quality, Smile, Id, KnownGender, MatchConfidence, Name, Urls.
        public let celebrityFaces: [Celebrity]?
        ///  Support for estimating image orientation using the the OrientationCorrection field has ceased as of August 2021. Any returned values for this field included in an API response will always be NULL.  The orientation of the input image (counterclockwise direction). If your application displays the image, you can use this value to correct the orientation. The bounding box coordinates returned in CelebrityFaces and UnrecognizedFaces represent face locations before the image orientation is corrected.   If the input image is in .jpeg format, it might contain exchangeable image (Exif) metadata that includes the image's orientation. If so, and the Exif metadata for the input image populates the orientation field, the value of OrientationCorrection is null. The CelebrityFaces and UnrecognizedFaces bounding box coordinates represent face locations after Exif metadata is used to correct the image orientation. Images in .png format don't contain Exif metadata.
        public let orientationCorrection: OrientationCorrection?
        /// Details about each unrecognized face in the image.
        public let unrecognizedFaces: [ComparedFace]?

        @inlinable
        public init(celebrityFaces: [Celebrity]? = nil, orientationCorrection: OrientationCorrection? = nil, unrecognizedFaces: [ComparedFace]? = nil) {
            self.celebrityFaces = celebrityFaces
            self.orientationCorrection = orientationCorrection
            self.unrecognizedFaces = unrecognizedFaces
        }

        private enum CodingKeys: String, CodingKey {
            case celebrityFaces = "CelebrityFaces"
            case orientationCorrection = "OrientationCorrection"
            case unrecognizedFaces = "UnrecognizedFaces"
        }
    }

    public struct RegionOfInterest: AWSEncodableShape & AWSDecodableShape {
        /// The box representing a region of interest on screen.
        public let boundingBox: BoundingBox?
        ///  Specifies a shape made up of up to 10 Point objects to define a region of interest.
        public let polygon: [Point]?

        @inlinable
        public init(boundingBox: BoundingBox? = nil, polygon: [Point]? = nil) {
            self.boundingBox = boundingBox
            self.polygon = polygon
        }

        private enum CodingKeys: String, CodingKey {
            case boundingBox = "BoundingBox"
            case polygon = "Polygon"
        }
    }

    public struct ResourceAlreadyExistsException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct ResourceInUseException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct ResourceNotFoundException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct ResourceNotReadyException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct S3Destination: AWSEncodableShape & AWSDecodableShape {
        ///  The name of the Amazon S3 bucket you want to associate with the streaming video project. You must be the owner of the Amazon S3 bucket.
        public let bucket: String?
        ///  The prefix value of the location within the bucket that you want the information to be published to.  For more information, see Using prefixes.
        public let keyPrefix: String?

        @inlinable
        public init(bucket: String? = nil, keyPrefix: String? = nil) {
            self.bucket = bucket
            self.keyPrefix = keyPrefix
        }

        public func validate(name: String) throws {
            try self.validate(self.bucket, name: "bucket", parent: name, max: 255)
            try self.validate(self.bucket, name: "bucket", parent: name, min: 3)
            try self.validate(self.bucket, name: "bucket", parent: name, pattern: "^[0-9A-Za-z\\.\\-_]*$")
            try self.validate(self.keyPrefix, name: "keyPrefix", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case bucket = "Bucket"
            case keyPrefix = "KeyPrefix"
        }
    }

    public struct S3Object: AWSEncodableShape & AWSDecodableShape {
        /// Name of the S3 bucket.
        public let bucket: String?
        /// S3 object key name.
        public let name: String?
        /// If the bucket is versioning enabled, you can specify the object version.
        public let version: String?

        @inlinable
        public init(bucket: String? = nil, name: String? = nil, version: String? = nil) {
            self.bucket = bucket
            self.name = name
            self.version = version
        }

        public func validate(name: String) throws {
            try self.validate(self.bucket, name: "bucket", parent: name, max: 255)
            try self.validate(self.bucket, name: "bucket", parent: name, min: 3)
            try self.validate(self.bucket, name: "bucket", parent: name, pattern: "^[0-9A-Za-z\\.\\-_]*$")
            try self.validate(self.name, name: "name", parent: name, max: 1024)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.version, name: "version", parent: name, max: 1024)
            try self.validate(self.version, name: "version", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case bucket = "Bucket"
            case name = "Name"
            case version = "Version"
        }
    }

    public struct SearchFacesByImageRequest: AWSEncodableShape {
        /// ID of the collection to search.
        public let collectionId: String
        /// (Optional) Specifies the minimum confidence in the face match to return. For example, don't return any matches where confidence in matches is less than 70%. The default value is 80%.
        public let faceMatchThreshold: Float?
        /// The input image as base64-encoded bytes or an S3 object. If you use the AWS CLI to call Amazon Rekognition operations, passing base64-encoded image bytes is not supported.  If you are using an AWS SDK to call Amazon Rekognition, you might not need to base64-encode image bytes passed using the Bytes field. For more information, see Images in the Amazon Rekognition developer guide.
        public let image: Image
        /// Maximum number of faces to return. The operation returns the maximum number of faces with the highest confidence in the match.
        public let maxFaces: Int?
        /// A filter that specifies a quality bar for how much filtering is done to identify faces. Filtered faces aren't searched for in the collection. If you specify AUTO, Amazon Rekognition chooses the quality bar. If you specify LOW, MEDIUM, or HIGH, filtering removes all faces that don’t meet the chosen quality bar. The quality bar is based on a variety of common use cases. Low-quality detections can occur for a number of reasons. Some examples are an object that's misidentified as a face, a face that's too blurry, or a face with a pose that's too extreme to use. If you specify NONE, no filtering is performed. The default value is NONE.  To use quality filtering, the collection you are using must be associated with version 3 of the face model or higher.
        public let qualityFilter: QualityFilter?

        @inlinable
        public init(collectionId: String, faceMatchThreshold: Float? = nil, image: Image, maxFaces: Int? = nil, qualityFilter: QualityFilter? = nil) {
            self.collectionId = collectionId
            self.faceMatchThreshold = faceMatchThreshold
            self.image = image
            self.maxFaces = maxFaces
            self.qualityFilter = qualityFilter
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, min: 0.0)
            try self.image.validate(name: "\(name).image")
            try self.validate(self.maxFaces, name: "maxFaces", parent: name, max: 4096)
            try self.validate(self.maxFaces, name: "maxFaces", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case faceMatchThreshold = "FaceMatchThreshold"
            case image = "Image"
            case maxFaces = "MaxFaces"
            case qualityFilter = "QualityFilter"
        }
    }

    public struct SearchFacesByImageResponse: AWSDecodableShape {
        /// An array of faces that match the input face, along with the confidence in the match.
        public let faceMatches: [FaceMatch]?
        /// Version number of the face detection model associated with the input collection (CollectionId).
        public let faceModelVersion: String?
        /// The bounding box around the face in the input image that Amazon Rekognition used for the search.
        public let searchedFaceBoundingBox: BoundingBox?
        /// The level of confidence that the searchedFaceBoundingBox, contains a face.
        public let searchedFaceConfidence: Float?

        @inlinable
        public init(faceMatches: [FaceMatch]? = nil, faceModelVersion: String? = nil, searchedFaceBoundingBox: BoundingBox? = nil, searchedFaceConfidence: Float? = nil) {
            self.faceMatches = faceMatches
            self.faceModelVersion = faceModelVersion
            self.searchedFaceBoundingBox = searchedFaceBoundingBox
            self.searchedFaceConfidence = searchedFaceConfidence
        }

        private enum CodingKeys: String, CodingKey {
            case faceMatches = "FaceMatches"
            case faceModelVersion = "FaceModelVersion"
            case searchedFaceBoundingBox = "SearchedFaceBoundingBox"
            case searchedFaceConfidence = "SearchedFaceConfidence"
        }
    }

    public struct SearchFacesRequest: AWSEncodableShape {
        /// ID of the collection the face belongs to.
        public let collectionId: String
        /// ID of a face to find matches for in the collection.
        public let faceId: String
        /// Optional value specifying the minimum confidence in the face match to return. For example, don't return any matches where confidence in matches is less than 70%. The default value is 80%.
        public let faceMatchThreshold: Float?
        /// Maximum number of faces to return. The operation returns the maximum number of faces with the highest confidence in the match.
        public let maxFaces: Int?

        @inlinable
        public init(collectionId: String, faceId: String, faceMatchThreshold: Float? = nil, maxFaces: Int? = nil) {
            self.collectionId = collectionId
            self.faceId = faceId
            self.faceMatchThreshold = faceMatchThreshold
            self.maxFaces = maxFaces
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.faceId, name: "faceId", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, min: 0.0)
            try self.validate(self.maxFaces, name: "maxFaces", parent: name, max: 4096)
            try self.validate(self.maxFaces, name: "maxFaces", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case faceId = "FaceId"
            case faceMatchThreshold = "FaceMatchThreshold"
            case maxFaces = "MaxFaces"
        }
    }

    public struct SearchFacesResponse: AWSDecodableShape {
        /// An array of faces that matched the input face, along with the confidence in the match.
        public let faceMatches: [FaceMatch]?
        /// Version number of the face detection model associated with the input collection (CollectionId).
        public let faceModelVersion: String?
        /// ID of the face that was searched for matches in a collection.
        public let searchedFaceId: String?

        @inlinable
        public init(faceMatches: [FaceMatch]? = nil, faceModelVersion: String? = nil, searchedFaceId: String? = nil) {
            self.faceMatches = faceMatches
            self.faceModelVersion = faceModelVersion
            self.searchedFaceId = searchedFaceId
        }

        private enum CodingKeys: String, CodingKey {
            case faceMatches = "FaceMatches"
            case faceModelVersion = "FaceModelVersion"
            case searchedFaceId = "SearchedFaceId"
        }
    }

    public struct SearchUsersByImageRequest: AWSEncodableShape {
        /// The ID of an existing collection containing the UserID.
        public let collectionId: String
        public let image: Image
        /// Maximum number of UserIDs to return.
        public let maxUsers: Int?
        /// A filter that specifies a quality bar for how much filtering is done to identify faces. Filtered faces aren't searched for in the collection. The default value is NONE.
        public let qualityFilter: QualityFilter?
        /// Specifies the minimum confidence in the UserID match to return. Default value is 80.
        public let userMatchThreshold: Float?

        @inlinable
        public init(collectionId: String, image: Image, maxUsers: Int? = nil, qualityFilter: QualityFilter? = nil, userMatchThreshold: Float? = nil) {
            self.collectionId = collectionId
            self.image = image
            self.maxUsers = maxUsers
            self.qualityFilter = qualityFilter
            self.userMatchThreshold = userMatchThreshold
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.image.validate(name: "\(name).image")
            try self.validate(self.maxUsers, name: "maxUsers", parent: name, max: 500)
            try self.validate(self.maxUsers, name: "maxUsers", parent: name, min: 1)
            try self.validate(self.userMatchThreshold, name: "userMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.userMatchThreshold, name: "userMatchThreshold", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case image = "Image"
            case maxUsers = "MaxUsers"
            case qualityFilter = "QualityFilter"
            case userMatchThreshold = "UserMatchThreshold"
        }
    }

    public struct SearchUsersByImageResponse: AWSDecodableShape {
        /// Version number of the face detection model associated with the input collection CollectionId.
        public let faceModelVersion: String?
        /// A list of FaceDetail objects containing the BoundingBox for the largest face in image, as well as the confidence in the bounding box, that was searched for matches. If no valid face is detected in the image the response will contain no SearchedFace object.
        public let searchedFace: SearchedFaceDetails?
        /// List of UnsearchedFace objects. Contains the face details infered from the specified image but not used for search. Contains reasons that describe why a face wasn't used for Search.
        public let unsearchedFaces: [UnsearchedFace]?
        /// An array of UserID objects that matched the input face, along with the confidence in the match. The returned structure will be empty if there are no matches. Returned if the SearchUsersByImageResponse action is successful.
        public let userMatches: [UserMatch]?

        @inlinable
        public init(faceModelVersion: String? = nil, searchedFace: SearchedFaceDetails? = nil, unsearchedFaces: [UnsearchedFace]? = nil, userMatches: [UserMatch]? = nil) {
            self.faceModelVersion = faceModelVersion
            self.searchedFace = searchedFace
            self.unsearchedFaces = unsearchedFaces
            self.userMatches = userMatches
        }

        private enum CodingKeys: String, CodingKey {
            case faceModelVersion = "FaceModelVersion"
            case searchedFace = "SearchedFace"
            case unsearchedFaces = "UnsearchedFaces"
            case userMatches = "UserMatches"
        }
    }

    public struct SearchUsersRequest: AWSEncodableShape {
        /// The ID of an existing collection containing the UserID, used with a UserId or FaceId. If a FaceId is provided, UserId isn’t required to be present in the Collection.
        public let collectionId: String
        /// ID for the existing face.
        public let faceId: String?
        /// Maximum number of identities to return.
        public let maxUsers: Int?
        /// ID for the existing User.
        public let userId: String?
        /// Optional value that specifies the minimum confidence in the matched UserID to return. Default value of 80.
        public let userMatchThreshold: Float?

        @inlinable
        public init(collectionId: String, faceId: String? = nil, maxUsers: Int? = nil, userId: String? = nil, userMatchThreshold: Float? = nil) {
            self.collectionId = collectionId
            self.faceId = faceId
            self.maxUsers = maxUsers
            self.userId = userId
            self.userMatchThreshold = userMatchThreshold
        }

        public func validate(name: String) throws {
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.faceId, name: "faceId", parent: name, pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
            try self.validate(self.maxUsers, name: "maxUsers", parent: name, max: 500)
            try self.validate(self.maxUsers, name: "maxUsers", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, max: 128)
            try self.validate(self.userId, name: "userId", parent: name, min: 1)
            try self.validate(self.userId, name: "userId", parent: name, pattern: "^[a-zA-Z0-9_.\\-:]+$")
            try self.validate(self.userMatchThreshold, name: "userMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.userMatchThreshold, name: "userMatchThreshold", parent: name, min: 0.0)
        }

        private enum CodingKeys: String, CodingKey {
            case collectionId = "CollectionId"
            case faceId = "FaceId"
            case maxUsers = "MaxUsers"
            case userId = "UserId"
            case userMatchThreshold = "UserMatchThreshold"
        }
    }

    public struct SearchUsersResponse: AWSDecodableShape {
        /// Version number of the face detection model associated with the input CollectionId.
        public let faceModelVersion: String?
        /// Contains the ID of a face that was used to search for matches in a collection.
        public let searchedFace: SearchedFace?
        /// Contains the ID of the UserID that was used to search for matches in a collection.
        public let searchedUser: SearchedUser?
        /// An array of UserMatch objects that matched the input face along with the confidence in the match. Array will be empty if there are no matches.
        public let userMatches: [UserMatch]?

        @inlinable
        public init(faceModelVersion: String? = nil, searchedFace: SearchedFace? = nil, searchedUser: SearchedUser? = nil, userMatches: [UserMatch]? = nil) {
            self.faceModelVersion = faceModelVersion
            self.searchedFace = searchedFace
            self.searchedUser = searchedUser
            self.userMatches = userMatches
        }

        private enum CodingKeys: String, CodingKey {
            case faceModelVersion = "FaceModelVersion"
            case searchedFace = "SearchedFace"
            case searchedUser = "SearchedUser"
            case userMatches = "UserMatches"
        }
    }

    public struct SearchedFace: AWSDecodableShape {
        ///  Unique identifier assigned to the face.
        public let faceId: String?

        @inlinable
        public init(faceId: String? = nil) {
            self.faceId = faceId
        }

        private enum CodingKeys: String, CodingKey {
            case faceId = "FaceId"
        }
    }

    public struct SearchedFaceDetails: AWSDecodableShape {
        public let faceDetail: FaceDetail?

        @inlinable
        public init(faceDetail: FaceDetail? = nil) {
            self.faceDetail = faceDetail
        }

        private enum CodingKeys: String, CodingKey {
            case faceDetail = "FaceDetail"
        }
    }

    public struct SearchedUser: AWSDecodableShape {
        ///  A provided ID for the UserID. Unique within the collection.
        public let userId: String?

        @inlinable
        public init(userId: String? = nil) {
            self.userId = userId
        }

        private enum CodingKeys: String, CodingKey {
            case userId = "UserId"
        }
    }

    public struct SegmentDetection: AWSDecodableShape {
        ///  The duration of a video segment, expressed in frames.
        public let durationFrames: Int64?
        /// The duration of the detected segment in milliseconds.
        public let durationMillis: Int64?
        /// The duration of the timecode for the detected segment in SMPTE format.
        public let durationSMPTE: String?
        ///  The frame number at the end of a video segment, using a frame index that starts with 0.
        public let endFrameNumber: Int64?
        /// The frame-accurate SMPTE timecode, from the start of a video, for the end of a detected segment.  EndTimecode is in HH:MM:SS:fr format (and ;fr for drop frame-rates).
        public let endTimecodeSMPTE: String?
        /// The end time of the detected segment, in milliseconds, from the start of the video. This value is rounded down.
        public let endTimestampMillis: Int64?
        /// If the segment is a shot detection, contains information about the shot detection.
        public let shotSegment: ShotSegment?
        ///  The frame number of the start of a video segment, using a frame index that starts with 0.
        public let startFrameNumber: Int64?
        /// The frame-accurate SMPTE timecode, from the start of a video, for the start of a detected segment. StartTimecode is in HH:MM:SS:fr format (and ;fr for drop frame-rates).
        public let startTimecodeSMPTE: String?
        /// The start time of the detected segment in milliseconds from the start of the video. This value is rounded down. For example, if the actual timestamp is 100.6667 milliseconds, Amazon Rekognition Video returns a value of 100 millis.
        public let startTimestampMillis: Int64?
        /// If the segment is a technical cue, contains information about the technical cue.
        public let technicalCueSegment: TechnicalCueSegment?
        /// The type of the  segment. Valid values are TECHNICAL_CUE and SHOT.
        public let type: SegmentType?

        @inlinable
        public init(durationFrames: Int64? = nil, durationMillis: Int64? = nil, durationSMPTE: String? = nil, endFrameNumber: Int64? = nil, endTimecodeSMPTE: String? = nil, endTimestampMillis: Int64? = nil, shotSegment: ShotSegment? = nil, startFrameNumber: Int64? = nil, startTimecodeSMPTE: String? = nil, startTimestampMillis: Int64? = nil, technicalCueSegment: TechnicalCueSegment? = nil, type: SegmentType? = nil) {
            self.durationFrames = durationFrames
            self.durationMillis = durationMillis
            self.durationSMPTE = durationSMPTE
            self.endFrameNumber = endFrameNumber
            self.endTimecodeSMPTE = endTimecodeSMPTE
            self.endTimestampMillis = endTimestampMillis
            self.shotSegment = shotSegment
            self.startFrameNumber = startFrameNumber
            self.startTimecodeSMPTE = startTimecodeSMPTE
            self.startTimestampMillis = startTimestampMillis
            self.technicalCueSegment = technicalCueSegment
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case durationFrames = "DurationFrames"
            case durationMillis = "DurationMillis"
            case durationSMPTE = "DurationSMPTE"
            case endFrameNumber = "EndFrameNumber"
            case endTimecodeSMPTE = "EndTimecodeSMPTE"
            case endTimestampMillis = "EndTimestampMillis"
            case shotSegment = "ShotSegment"
            case startFrameNumber = "StartFrameNumber"
            case startTimecodeSMPTE = "StartTimecodeSMPTE"
            case startTimestampMillis = "StartTimestampMillis"
            case technicalCueSegment = "TechnicalCueSegment"
            case type = "Type"
        }
    }

    public struct SegmentTypeInfo: AWSDecodableShape {
        /// The version of the model used to detect segments.
        public let modelVersion: String?
        /// The type of a segment (technical cue or shot detection).
        public let type: SegmentType?

        @inlinable
        public init(modelVersion: String? = nil, type: SegmentType? = nil) {
            self.modelVersion = modelVersion
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case modelVersion = "ModelVersion"
            case type = "Type"
        }
    }

    public struct ServiceQuotaExceededException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct SessionNotFoundException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct ShotSegment: AWSDecodableShape {
        /// The confidence that Amazon Rekognition Video has in the accuracy of the detected segment.
        public let confidence: Float?
        /// An Identifier for a shot detection segment detected in a video.
        public let index: Int64?

        @inlinable
        public init(confidence: Float? = nil, index: Int64? = nil) {
            self.confidence = confidence
            self.index = index
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case index = "Index"
        }
    }

    public struct Smile: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the face is smiling or not.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct StartCelebrityRecognitionRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartCelebrityRecognition requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// The Amazon SNS topic ARN that you want Amazon Rekognition Video to publish the completion status of the celebrity recognition analysis to. The Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy.
        public let notificationChannel: NotificationChannel?
        /// The video in which you want to recognize celebrities. The video must be stored in an Amazon S3 bucket.
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, jobTag: String? = nil, notificationChannel: NotificationChannel? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.jobTag = jobTag
            self.notificationChannel = notificationChannel
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case jobTag = "JobTag"
            case notificationChannel = "NotificationChannel"
            case video = "Video"
        }
    }

    public struct StartCelebrityRecognitionResponse: AWSDecodableShape {
        /// The identifier for the celebrity recognition analysis job. Use JobId to identify the job in a subsequent call to GetCelebrityRecognition.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartContentModerationRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartContentModeration requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// Specifies the minimum confidence that Amazon Rekognition must have in order to return a moderated content label. Confidence represents how certain Amazon Rekognition is that the moderated content is correctly identified. 0 is the lowest confidence. 100 is the highest confidence.  Amazon Rekognition doesn't return any moderated content labels with a confidence level lower than this specified value. If you don't specify MinConfidence, GetContentModeration returns labels with confidence values greater than or equal to 50 percent.
        public let minConfidence: Float?
        /// The Amazon SNS topic ARN that you want Amazon Rekognition Video to publish the completion status of the content analysis to. The Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy to access the topic.
        public let notificationChannel: NotificationChannel?
        /// The video in which you want to detect inappropriate, unwanted, or offensive content. The video must be stored in an Amazon S3 bucket.
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, jobTag: String? = nil, minConfidence: Float? = nil, notificationChannel: NotificationChannel? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.jobTag = jobTag
            self.minConfidence = minConfidence
            self.notificationChannel = notificationChannel
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case jobTag = "JobTag"
            case minConfidence = "MinConfidence"
            case notificationChannel = "NotificationChannel"
            case video = "Video"
        }
    }

    public struct StartContentModerationResponse: AWSDecodableShape {
        /// The identifier for the content analysis job. Use JobId to identify the job in a subsequent call to GetContentModeration.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartFaceDetectionRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartFaceDetection requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// The face attributes you want returned.  DEFAULT - The following subset of facial attributes are returned: BoundingBox, Confidence, Pose, Quality and Landmarks.   ALL - All facial attributes are returned.
        public let faceAttributes: FaceAttributes?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// The ARN of the Amazon SNS topic to which you want Amazon Rekognition Video to publish the completion status of the face detection operation. The Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy.
        public let notificationChannel: NotificationChannel?
        /// The video in which you want to detect faces. The video must be stored in an Amazon S3 bucket.
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, faceAttributes: FaceAttributes? = nil, jobTag: String? = nil, notificationChannel: NotificationChannel? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.faceAttributes = faceAttributes
            self.jobTag = jobTag
            self.notificationChannel = notificationChannel
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case faceAttributes = "FaceAttributes"
            case jobTag = "JobTag"
            case notificationChannel = "NotificationChannel"
            case video = "Video"
        }
    }

    public struct StartFaceDetectionResponse: AWSDecodableShape {
        /// The identifier for the face detection job. Use JobId to identify the job in a subsequent call to GetFaceDetection.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartFaceSearchRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartFaceSearch requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// ID of the collection that contains the faces you want to search for.
        public let collectionId: String
        /// The minimum confidence in the person match to return. For example, don't return any matches where confidence in matches is less than 70%. The default value is 80%.
        public let faceMatchThreshold: Float?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// The ARN of the Amazon SNS topic to which you want Amazon Rekognition Video to publish the completion status of the search. The Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy to access the topic.
        public let notificationChannel: NotificationChannel?
        /// The video you want to search. The video must be stored in an Amazon S3 bucket.
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, collectionId: String, faceMatchThreshold: Float? = nil, jobTag: String? = nil, notificationChannel: NotificationChannel? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.collectionId = collectionId
            self.faceMatchThreshold = faceMatchThreshold
            self.jobTag = jobTag
            self.notificationChannel = notificationChannel
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.collectionId, name: "collectionId", parent: name, max: 255)
            try self.validate(self.collectionId, name: "collectionId", parent: name, min: 1)
            try self.validate(self.collectionId, name: "collectionId", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, max: 100.0)
            try self.validate(self.faceMatchThreshold, name: "faceMatchThreshold", parent: name, min: 0.0)
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case collectionId = "CollectionId"
            case faceMatchThreshold = "FaceMatchThreshold"
            case jobTag = "JobTag"
            case notificationChannel = "NotificationChannel"
            case video = "Video"
        }
    }

    public struct StartFaceSearchResponse: AWSDecodableShape {
        /// The identifier for the search job. Use JobId to identify the job in a subsequent call to GetFaceSearch.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartLabelDetectionRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartLabelDetection requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// The features to return after video analysis. You can specify that GENERAL_LABELS are returned.
        public let features: [LabelDetectionFeatureName]?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// Specifies the minimum confidence that Amazon Rekognition Video must have in order to return a detected label. Confidence represents how certain Amazon Rekognition is that a label is correctly identified.0 is the lowest confidence. 100 is the highest confidence.  Amazon Rekognition Video doesn't return any labels with a confidence level lower than this specified value. If you don't specify MinConfidence, the operation returns labels and bounding boxes (if detected)  with confidence values greater than or equal to 50 percent.
        public let minConfidence: Float?
        /// The Amazon SNS topic ARN you want Amazon Rekognition Video to publish the completion status of the label detection operation to. The Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy.
        public let notificationChannel: NotificationChannel?
        /// The settings for a StartLabelDetection request.Contains the specified parameters for the label detection request of an asynchronous label analysis operation.  Settings can include filters for GENERAL_LABELS.
        public let settings: LabelDetectionSettings?
        /// The video in which you want to detect labels. The video must be stored in an Amazon S3 bucket.
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, features: [LabelDetectionFeatureName]? = nil, jobTag: String? = nil, minConfidence: Float? = nil, notificationChannel: NotificationChannel? = nil, settings: LabelDetectionSettings? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.features = features
            self.jobTag = jobTag
            self.minConfidence = minConfidence
            self.notificationChannel = notificationChannel
            self.settings = settings
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.features, name: "features", parent: name, max: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, max: 100.0)
            try self.validate(self.minConfidence, name: "minConfidence", parent: name, min: 0.0)
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.settings?.validate(name: "\(name).settings")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case features = "Features"
            case jobTag = "JobTag"
            case minConfidence = "MinConfidence"
            case notificationChannel = "NotificationChannel"
            case settings = "Settings"
            case video = "Video"
        }
    }

    public struct StartLabelDetectionResponse: AWSDecodableShape {
        /// The identifier for the label detection job. Use JobId to identify the job in a subsequent call to GetLabelDetection.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartMediaAnalysisJobRequest: AWSEncodableShape {
        /// Idempotency token used to prevent the accidental creation of duplicate versions. If you use the same token with multiple StartMediaAnalysisJobRequest requests, the same response is returned. Use ClientRequestToken to prevent the same request from being processed more than once.
        public let clientRequestToken: String?
        /// Input data to be analyzed by the job.
        public let input: MediaAnalysisInput
        /// The name of the job. Does not have to be unique.
        public let jobName: String?
        /// The identifier of customer managed AWS KMS key (name or ARN). The key  is used to encrypt images copied into the service. The key is also used  to encrypt results and manifest files written to the output Amazon S3 bucket.
        public let kmsKeyId: String?
        /// Configuration options for the media analysis job to be created.
        public let operationsConfig: MediaAnalysisOperationsConfig
        /// The Amazon S3 bucket location to store the results.
        public let outputConfig: MediaAnalysisOutputConfig

        @inlinable
        public init(clientRequestToken: String? = StartMediaAnalysisJobRequest.idempotencyToken(), input: MediaAnalysisInput, jobName: String? = nil, kmsKeyId: String? = nil, operationsConfig: MediaAnalysisOperationsConfig, outputConfig: MediaAnalysisOutputConfig) {
            self.clientRequestToken = clientRequestToken
            self.input = input
            self.jobName = jobName
            self.kmsKeyId = kmsKeyId
            self.operationsConfig = operationsConfig
            self.outputConfig = outputConfig
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.input.validate(name: "\(name).input")
            try self.validate(self.jobName, name: "jobName", parent: name, max: 64)
            try self.validate(self.jobName, name: "jobName", parent: name, min: 1)
            try self.validate(self.jobName, name: "jobName", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, max: 2048)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, min: 1)
            try self.validate(self.kmsKeyId, name: "kmsKeyId", parent: name, pattern: "^[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,2048}$")
            try self.operationsConfig.validate(name: "\(name).operationsConfig")
            try self.outputConfig.validate(name: "\(name).outputConfig")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case input = "Input"
            case jobName = "JobName"
            case kmsKeyId = "KmsKeyId"
            case operationsConfig = "OperationsConfig"
            case outputConfig = "OutputConfig"
        }
    }

    public struct StartMediaAnalysisJobResponse: AWSDecodableShape {
        /// Identifier for the created job.
        public let jobId: String

        @inlinable
        public init(jobId: String) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartPersonTrackingRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartPersonTracking requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// The Amazon SNS topic ARN you want Amazon Rekognition Video to publish the completion status of the people detection operation to. The Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy.
        public let notificationChannel: NotificationChannel?
        /// The video in which you want to detect people. The video must be stored in an Amazon S3 bucket.
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, jobTag: String? = nil, notificationChannel: NotificationChannel? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.jobTag = jobTag
            self.notificationChannel = notificationChannel
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case jobTag = "JobTag"
            case notificationChannel = "NotificationChannel"
            case video = "Video"
        }
    }

    public struct StartPersonTrackingResponse: AWSDecodableShape {
        /// The identifier for the person detection job. Use JobId to identify the job in a subsequent call to GetPersonTracking.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartProjectVersionRequest: AWSEncodableShape {
        /// The maximum number of inference units to use for auto-scaling the model. If you don't specify a value, Amazon Rekognition Custom Labels doesn't auto-scale the model.
        public let maxInferenceUnits: Int?
        /// The minimum number of inference units to use. A single inference unit represents 1 hour of processing.  Use a higher number to increase the TPS throughput of your model. You are charged for the number of inference units that you use.
        public let minInferenceUnits: Int
        /// The Amazon Resource Name(ARN) of the model version that you want to start.
        public let projectVersionArn: String

        @inlinable
        public init(maxInferenceUnits: Int? = nil, minInferenceUnits: Int, projectVersionArn: String) {
            self.maxInferenceUnits = maxInferenceUnits
            self.minInferenceUnits = minInferenceUnits
            self.projectVersionArn = projectVersionArn
        }

        public func validate(name: String) throws {
            try self.validate(self.maxInferenceUnits, name: "maxInferenceUnits", parent: name, min: 1)
            try self.validate(self.minInferenceUnits, name: "minInferenceUnits", parent: name, min: 1)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, max: 2048)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, min: 20)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case maxInferenceUnits = "MaxInferenceUnits"
            case minInferenceUnits = "MinInferenceUnits"
            case projectVersionArn = "ProjectVersionArn"
        }
    }

    public struct StartProjectVersionResponse: AWSDecodableShape {
        /// The current running status of the model.
        public let status: ProjectVersionStatus?

        @inlinable
        public init(status: ProjectVersionStatus? = nil) {
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
        }
    }

    public struct StartSegmentDetectionFilters: AWSEncodableShape {
        /// Filters that are specific to shot detections.
        public let shotFilter: StartShotDetectionFilter?
        /// Filters that are specific to technical cues.
        public let technicalCueFilter: StartTechnicalCueDetectionFilter?

        @inlinable
        public init(shotFilter: StartShotDetectionFilter? = nil, technicalCueFilter: StartTechnicalCueDetectionFilter? = nil) {
            self.shotFilter = shotFilter
            self.technicalCueFilter = technicalCueFilter
        }

        public func validate(name: String) throws {
            try self.shotFilter?.validate(name: "\(name).shotFilter")
            try self.technicalCueFilter?.validate(name: "\(name).technicalCueFilter")
        }

        private enum CodingKeys: String, CodingKey {
            case shotFilter = "ShotFilter"
            case technicalCueFilter = "TechnicalCueFilter"
        }
    }

    public struct StartSegmentDetectionRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartSegmentDetection requests, the same JobId is returned. Use ClientRequestToken to prevent the same job from being accidently started more than once.
        public let clientRequestToken: String?
        /// Filters for technical cue or shot detection.
        public let filters: StartSegmentDetectionFilters?
        /// An identifier you specify that's returned in the completion notification that's published to your Amazon Simple Notification Service topic. For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        /// The ARN of the Amazon SNS topic to which you want Amazon Rekognition Video to publish the completion status of the segment detection operation. Note that the Amazon SNS topic must have a topic name that begins with AmazonRekognition if you are using the AmazonRekognitionServiceRole permissions policy to access the topic.
        public let notificationChannel: NotificationChannel?
        /// An array of segment types to detect in the video. Valid values are TECHNICAL_CUE and SHOT.
        public let segmentTypes: [SegmentType]
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, filters: StartSegmentDetectionFilters? = nil, jobTag: String? = nil, notificationChannel: NotificationChannel? = nil, segmentTypes: [SegmentType], video: Video) {
            self.clientRequestToken = clientRequestToken
            self.filters = filters
            self.jobTag = jobTag
            self.notificationChannel = notificationChannel
            self.segmentTypes = segmentTypes
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.filters?.validate(name: "\(name).filters")
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.validate(self.segmentTypes, name: "segmentTypes", parent: name, min: 1)
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case filters = "Filters"
            case jobTag = "JobTag"
            case notificationChannel = "NotificationChannel"
            case segmentTypes = "SegmentTypes"
            case video = "Video"
        }
    }

    public struct StartSegmentDetectionResponse: AWSDecodableShape {
        /// Unique identifier for the segment detection job. The JobId is returned from StartSegmentDetection.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StartShotDetectionFilter: AWSEncodableShape {
        /// Specifies the minimum confidence that Amazon Rekognition Video must have in order to return a detected segment. Confidence represents how certain Amazon Rekognition is that a segment is correctly identified. 0 is the lowest confidence. 100 is the highest confidence.  Amazon Rekognition Video doesn't return any segments with a confidence level lower than this specified value. If you don't specify MinSegmentConfidence, the GetSegmentDetection returns  segments with confidence values greater than or equal to 50 percent.
        public let minSegmentConfidence: Float?

        @inlinable
        public init(minSegmentConfidence: Float? = nil) {
            self.minSegmentConfidence = minSegmentConfidence
        }

        public func validate(name: String) throws {
            try self.validate(self.minSegmentConfidence, name: "minSegmentConfidence", parent: name, max: 100.0)
            try self.validate(self.minSegmentConfidence, name: "minSegmentConfidence", parent: name, min: 50.0)
        }

        private enum CodingKeys: String, CodingKey {
            case minSegmentConfidence = "MinSegmentConfidence"
        }
    }

    public struct StartStreamProcessorRequest: AWSEncodableShape {
        /// The name of the stream processor to start processing.
        public let name: String
        ///  Specifies the starting point in the Kinesis stream to start processing.  You can use the producer timestamp or the fragment number. If you use the producer timestamp, you must put the time in milliseconds. For more information about fragment numbers, see Fragment.   This is a required parameter for label detection stream processors and should not be used to start a face search stream processor.
        public let startSelector: StreamProcessingStartSelector?
        ///  Specifies when to stop processing the stream. You can specify a  maximum amount of time to process the video.   This is a required parameter for label detection stream processors and should not be used to start a face search stream processor.
        public let stopSelector: StreamProcessingStopSelector?

        @inlinable
        public init(name: String, startSelector: StreamProcessingStartSelector? = nil, stopSelector: StreamProcessingStopSelector? = nil) {
            self.name = name
            self.startSelector = startSelector
            self.stopSelector = stopSelector
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.startSelector?.validate(name: "\(name).startSelector")
            try self.stopSelector?.validate(name: "\(name).stopSelector")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case startSelector = "StartSelector"
            case stopSelector = "StopSelector"
        }
    }

    public struct StartStreamProcessorResponse: AWSDecodableShape {
        ///  A unique identifier for the stream processing session.
        public let sessionId: String?

        @inlinable
        public init(sessionId: String? = nil) {
            self.sessionId = sessionId
        }

        private enum CodingKeys: String, CodingKey {
            case sessionId = "SessionId"
        }
    }

    public struct StartTechnicalCueDetectionFilter: AWSEncodableShape {
        ///  A filter that allows you to control the black frame detection by specifying the black levels and pixel coverage of black pixels in a frame. Videos can come from multiple sources, formats, and time periods, with different standards and varying noise levels for black frames that need to be accounted for.
        public let blackFrame: BlackFrame?
        /// Specifies the minimum confidence that Amazon Rekognition Video must have in order to return a detected segment. Confidence represents how certain Amazon Rekognition is that a segment is correctly identified. 0 is the lowest confidence. 100 is the highest confidence.  Amazon Rekognition Video doesn't return any segments with a confidence level lower than this specified value. If you don't specify MinSegmentConfidence, GetSegmentDetection returns  segments with confidence values greater than or equal to 50 percent.
        public let minSegmentConfidence: Float?

        @inlinable
        public init(blackFrame: BlackFrame? = nil, minSegmentConfidence: Float? = nil) {
            self.blackFrame = blackFrame
            self.minSegmentConfidence = minSegmentConfidence
        }

        public func validate(name: String) throws {
            try self.blackFrame?.validate(name: "\(name).blackFrame")
            try self.validate(self.minSegmentConfidence, name: "minSegmentConfidence", parent: name, max: 100.0)
            try self.validate(self.minSegmentConfidence, name: "minSegmentConfidence", parent: name, min: 50.0)
        }

        private enum CodingKeys: String, CodingKey {
            case blackFrame = "BlackFrame"
            case minSegmentConfidence = "MinSegmentConfidence"
        }
    }

    public struct StartTextDetectionFilters: AWSEncodableShape {
        /// Filter focusing on a certain area of the frame. Uses a BoundingBox object to set the region of the screen.
        public let regionsOfInterest: [RegionOfInterest]?
        /// Filters focusing on qualities of the text, such as confidence or size.
        public let wordFilter: DetectionFilter?

        @inlinable
        public init(regionsOfInterest: [RegionOfInterest]? = nil, wordFilter: DetectionFilter? = nil) {
            self.regionsOfInterest = regionsOfInterest
            self.wordFilter = wordFilter
        }

        public func validate(name: String) throws {
            try self.validate(self.regionsOfInterest, name: "regionsOfInterest", parent: name, max: 10)
            try self.wordFilter?.validate(name: "\(name).wordFilter")
        }

        private enum CodingKeys: String, CodingKey {
            case regionsOfInterest = "RegionsOfInterest"
            case wordFilter = "WordFilter"
        }
    }

    public struct StartTextDetectionRequest: AWSEncodableShape {
        /// Idempotent token used to identify the start request. If you use the same token with multiple StartTextDetection requests, the same JobId is returned. Use ClientRequestToken to prevent the same job  from being accidentaly started more than once.
        public let clientRequestToken: String?
        /// Optional parameters that let you set criteria the text must meet to be included in your response.
        public let filters: StartTextDetectionFilters?
        /// An identifier returned in the completion status published by your Amazon Simple Notification Service topic.  For example, you can use JobTag to group related jobs and identify them in the completion notification.
        public let jobTag: String?
        public let notificationChannel: NotificationChannel?
        public let video: Video

        @inlinable
        public init(clientRequestToken: String? = nil, filters: StartTextDetectionFilters? = nil, jobTag: String? = nil, notificationChannel: NotificationChannel? = nil, video: Video) {
            self.clientRequestToken = clientRequestToken
            self.filters = filters
            self.jobTag = jobTag
            self.notificationChannel = notificationChannel
            self.video = video
        }

        public func validate(name: String) throws {
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, max: 64)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, min: 1)
            try self.validate(self.clientRequestToken, name: "clientRequestToken", parent: name, pattern: "^[a-zA-Z0-9-_]+$")
            try self.filters?.validate(name: "\(name).filters")
            try self.validate(self.jobTag, name: "jobTag", parent: name, max: 1024)
            try self.validate(self.jobTag, name: "jobTag", parent: name, min: 1)
            try self.validate(self.jobTag, name: "jobTag", parent: name, pattern: "^[a-zA-Z0-9_.\\-:+=\\/]+$")
            try self.notificationChannel?.validate(name: "\(name).notificationChannel")
            try self.video.validate(name: "\(name).video")
        }

        private enum CodingKeys: String, CodingKey {
            case clientRequestToken = "ClientRequestToken"
            case filters = "Filters"
            case jobTag = "JobTag"
            case notificationChannel = "NotificationChannel"
            case video = "Video"
        }
    }

    public struct StartTextDetectionResponse: AWSDecodableShape {
        /// Identifier for the text detection job.  Use JobId to identify the job in a subsequent call to GetTextDetection.
        public let jobId: String?

        @inlinable
        public init(jobId: String? = nil) {
            self.jobId = jobId
        }

        private enum CodingKeys: String, CodingKey {
            case jobId = "JobId"
        }
    }

    public struct StopProjectVersionRequest: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the model version that you want to stop. This operation requires permissions to perform the rekognition:StopProjectVersion action.
        public let projectVersionArn: String

        @inlinable
        public init(projectVersionArn: String) {
            self.projectVersionArn = projectVersionArn
        }

        public func validate(name: String) throws {
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, max: 2048)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, min: 20)
            try self.validate(self.projectVersionArn, name: "projectVersionArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/version\\/[a-zA-Z0-9_.\\-]{1,255}\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case projectVersionArn = "ProjectVersionArn"
        }
    }

    public struct StopProjectVersionResponse: AWSDecodableShape {
        /// The current status of the stop operation.
        public let status: ProjectVersionStatus?

        @inlinable
        public init(status: ProjectVersionStatus? = nil) {
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case status = "Status"
        }
    }

    public struct StopStreamProcessorRequest: AWSEncodableShape {
        /// The name of a stream processor created by CreateStreamProcessor.
        public let name: String

        @inlinable
        public init(name: String) {
            self.name = name
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct StopStreamProcessorResponse: AWSDecodableShape {
        public init() {}
    }

    public struct StreamProcessingStartSelector: AWSEncodableShape {
        ///  Specifies the starting point in the stream to start processing. This can be done with a producer timestamp or a fragment number in a Kinesis stream.
        public let kvsStreamStartSelector: KinesisVideoStreamStartSelector?

        @inlinable
        public init(kvsStreamStartSelector: KinesisVideoStreamStartSelector? = nil) {
            self.kvsStreamStartSelector = kvsStreamStartSelector
        }

        public func validate(name: String) throws {
            try self.kvsStreamStartSelector?.validate(name: "\(name).kvsStreamStartSelector")
        }

        private enum CodingKeys: String, CodingKey {
            case kvsStreamStartSelector = "KVSStreamStartSelector"
        }
    }

    public struct StreamProcessingStopSelector: AWSEncodableShape {
        ///  Specifies the maximum amount of time in seconds that you want the stream to be processed. The largest amount of time is 2 minutes. The default is 10 seconds.
        public let maxDurationInSeconds: Int64?

        @inlinable
        public init(maxDurationInSeconds: Int64? = nil) {
            self.maxDurationInSeconds = maxDurationInSeconds
        }

        public func validate(name: String) throws {
            try self.validate(self.maxDurationInSeconds, name: "maxDurationInSeconds", parent: name, max: 120)
            try self.validate(self.maxDurationInSeconds, name: "maxDurationInSeconds", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case maxDurationInSeconds = "MaxDurationInSeconds"
        }
    }

    public struct StreamProcessor: AWSDecodableShape {
        /// Name of the Amazon Rekognition stream processor.
        public let name: String?
        /// Current status of the Amazon Rekognition stream processor.
        public let status: StreamProcessorStatus?

        @inlinable
        public init(name: String? = nil, status: StreamProcessorStatus? = nil) {
            self.name = name
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case status = "Status"
        }
    }

    public struct StreamProcessorDataSharingPreference: AWSEncodableShape & AWSDecodableShape {
        ///  If this option is set to true, you choose to share data with Rekognition to improve model performance.
        public let optIn: Bool

        @inlinable
        public init(optIn: Bool) {
            self.optIn = optIn
        }

        private enum CodingKeys: String, CodingKey {
            case optIn = "OptIn"
        }
    }

    public struct StreamProcessorInput: AWSEncodableShape & AWSDecodableShape {
        /// The Kinesis video stream input stream for the source streaming video.
        public let kinesisVideoStream: KinesisVideoStream?

        @inlinable
        public init(kinesisVideoStream: KinesisVideoStream? = nil) {
            self.kinesisVideoStream = kinesisVideoStream
        }

        public func validate(name: String) throws {
            try self.kinesisVideoStream?.validate(name: "\(name).kinesisVideoStream")
        }

        private enum CodingKeys: String, CodingKey {
            case kinesisVideoStream = "KinesisVideoStream"
        }
    }

    public struct StreamProcessorNotificationChannel: AWSEncodableShape & AWSDecodableShape {
        ///  The Amazon Resource Number (ARN) of the Amazon Amazon Simple Notification Service topic to which Amazon Rekognition posts the completion status.
        public let snsTopicArn: String

        @inlinable
        public init(snsTopicArn: String) {
            self.snsTopicArn = snsTopicArn
        }

        public func validate(name: String) throws {
            try self.validate(self.snsTopicArn, name: "snsTopicArn", parent: name, pattern: "^(^arn:aws:sns:.*:\\w{12}:.+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case snsTopicArn = "SNSTopicArn"
        }
    }

    public struct StreamProcessorOutput: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon Kinesis Data Streams stream to which the Amazon Rekognition stream processor streams the analysis results.
        public let kinesisDataStream: KinesisDataStream?
        ///  The Amazon S3 bucket location to which Amazon Rekognition publishes the detailed inference results of a video analysis operation.
        public let s3Destination: S3Destination?

        @inlinable
        public init(kinesisDataStream: KinesisDataStream? = nil, s3Destination: S3Destination? = nil) {
            self.kinesisDataStream = kinesisDataStream
            self.s3Destination = s3Destination
        }

        public func validate(name: String) throws {
            try self.kinesisDataStream?.validate(name: "\(name).kinesisDataStream")
            try self.s3Destination?.validate(name: "\(name).s3Destination")
        }

        private enum CodingKeys: String, CodingKey {
            case kinesisDataStream = "KinesisDataStream"
            case s3Destination = "S3Destination"
        }
    }

    public struct StreamProcessorSettings: AWSEncodableShape & AWSDecodableShape {
        public let connectedHome: ConnectedHomeSettings?
        /// Face search settings to use on a streaming video.
        public let faceSearch: FaceSearchSettings?

        @inlinable
        public init(connectedHome: ConnectedHomeSettings? = nil, faceSearch: FaceSearchSettings? = nil) {
            self.connectedHome = connectedHome
            self.faceSearch = faceSearch
        }

        public func validate(name: String) throws {
            try self.connectedHome?.validate(name: "\(name).connectedHome")
            try self.faceSearch?.validate(name: "\(name).faceSearch")
        }

        private enum CodingKeys: String, CodingKey {
            case connectedHome = "ConnectedHome"
            case faceSearch = "FaceSearch"
        }
    }

    public struct StreamProcessorSettingsForUpdate: AWSEncodableShape {
        ///  The label detection settings you want to use for your stream processor.
        public let connectedHomeForUpdate: ConnectedHomeSettingsForUpdate?

        @inlinable
        public init(connectedHomeForUpdate: ConnectedHomeSettingsForUpdate? = nil) {
            self.connectedHomeForUpdate = connectedHomeForUpdate
        }

        public func validate(name: String) throws {
            try self.connectedHomeForUpdate?.validate(name: "\(name).connectedHomeForUpdate")
        }

        private enum CodingKeys: String, CodingKey {
            case connectedHomeForUpdate = "ConnectedHomeForUpdate"
        }
    }

    public struct Summary: AWSDecodableShape {
        public let s3Object: S3Object?

        @inlinable
        public init(s3Object: S3Object? = nil) {
            self.s3Object = s3Object
        }

        private enum CodingKeys: String, CodingKey {
            case s3Object = "S3Object"
        }
    }

    public struct Sunglasses: AWSDecodableShape {
        /// Level of confidence in the determination.
        public let confidence: Float?
        /// Boolean value that indicates whether the face is wearing sunglasses or not.
        public let value: Bool?

        @inlinable
        public init(confidence: Float? = nil, value: Bool? = nil) {
            self.confidence = confidence
            self.value = value
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case value = "Value"
        }
    }

    public struct TagResourceRequest: AWSEncodableShape {
        ///  Amazon Resource Name (ARN) of the model, collection, or stream processor that you want to assign the tags to.
        public let resourceArn: String
        ///  The key-value tags to assign to the resource.
        public let tags: [String: String]

        @inlinable
        public init(resourceArn: String, tags: [String: String]) {
            self.resourceArn = resourceArn
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
            try self.tags.forEach {
                try validate($0.key, name: "tags.key", parent: name, max: 128)
                try validate($0.key, name: "tags.key", parent: name, min: 1)
                try validate($0.key, name: "tags.key", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, max: 256)
                try validate($0.value, name: "tags[\"\($0.key)\"]", parent: name, pattern: "^([\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*)$")
            }
            try self.validate(self.tags, name: "tags", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tags = "Tags"
        }
    }

    public struct TagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct TechnicalCueSegment: AWSDecodableShape {
        /// The confidence that Amazon Rekognition Video has in the accuracy of the detected segment.
        public let confidence: Float?
        /// The type of the technical cue.
        public let type: TechnicalCueType?

        @inlinable
        public init(confidence: Float? = nil, type: TechnicalCueType? = nil) {
            self.confidence = confidence
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case type = "Type"
        }
    }

    public struct TestingData: AWSEncodableShape & AWSDecodableShape {
        /// The assets used for testing.
        public let assets: [Asset]?
        /// If specified, Rekognition splits training dataset to create a test dataset for the training job.
        public let autoCreate: Bool?

        @inlinable
        public init(assets: [Asset]? = nil, autoCreate: Bool? = nil) {
            self.assets = assets
            self.autoCreate = autoCreate
        }

        public func validate(name: String) throws {
            try self.assets?.forEach {
                try $0.validate(name: "\(name).assets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case assets = "Assets"
            case autoCreate = "AutoCreate"
        }
    }

    public struct TestingDataResult: AWSDecodableShape {
        /// The testing dataset that was supplied for training.
        public let input: TestingData?
        /// The subset of the dataset that was actually tested. Some images (assets) might not be tested due to  file formatting and other issues.
        public let output: TestingData?
        /// The location of the data validation manifest. The data validation manifest is created for the test dataset during model training.
        public let validation: ValidationData?

        @inlinable
        public init(input: TestingData? = nil, output: TestingData? = nil, validation: ValidationData? = nil) {
            self.input = input
            self.output = output
            self.validation = validation
        }

        private enum CodingKeys: String, CodingKey {
            case input = "Input"
            case output = "Output"
            case validation = "Validation"
        }
    }

    public struct TextDetection: AWSDecodableShape {
        /// The confidence that Amazon Rekognition has in the accuracy of the detected text and the accuracy of the geometry points around the detected text.
        public let confidence: Float?
        /// The word or line of text recognized by Amazon Rekognition.
        public let detectedText: String?
        /// The location of the detected text on the image. Includes an axis aligned coarse bounding box surrounding the text and a finer grain polygon for more accurate spatial information.
        public let geometry: Geometry?
        /// The identifier for the detected text. The identifier is only unique for a single call to DetectText.
        public let id: Int?
        /// The Parent identifier for the detected text identified by the value of ID. If the type of detected text is LINE, the value of ParentId is Null.
        public let parentId: Int?
        /// The type of text that was detected.
        public let type: TextTypes?

        @inlinable
        public init(confidence: Float? = nil, detectedText: String? = nil, geometry: Geometry? = nil, id: Int? = nil, parentId: Int? = nil, type: TextTypes? = nil) {
            self.confidence = confidence
            self.detectedText = detectedText
            self.geometry = geometry
            self.id = id
            self.parentId = parentId
            self.type = type
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case detectedText = "DetectedText"
            case geometry = "Geometry"
            case id = "Id"
            case parentId = "ParentId"
            case type = "Type"
        }
    }

    public struct TextDetectionResult: AWSDecodableShape {
        /// Details about text detected in a video.
        public let textDetection: TextDetection?
        /// The time, in milliseconds from the start of the video, that the text was detected. Note that Timestamp is not guaranteed to be accurate to the individual frame where the text first appears.
        public let timestamp: Int64?

        @inlinable
        public init(textDetection: TextDetection? = nil, timestamp: Int64? = nil) {
            self.textDetection = textDetection
            self.timestamp = timestamp
        }

        private enum CodingKeys: String, CodingKey {
            case textDetection = "TextDetection"
            case timestamp = "Timestamp"
        }
    }

    public struct ThrottlingException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }

    public struct TrainingData: AWSEncodableShape & AWSDecodableShape {
        /// A manifest file that contains references to the training images and ground-truth annotations.
        public let assets: [Asset]?

        @inlinable
        public init(assets: [Asset]? = nil) {
            self.assets = assets
        }

        public func validate(name: String) throws {
            try self.assets?.forEach {
                try $0.validate(name: "\(name).assets[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case assets = "Assets"
        }
    }

    public struct TrainingDataResult: AWSDecodableShape {
        /// The training data that you supplied.
        public let input: TrainingData?
        /// Reference to images (assets) that were actually used during training with trained model predictions.
        public let output: TrainingData?
        /// A manifest that you supplied for training, with validation results for each line.
        public let validation: ValidationData?

        @inlinable
        public init(input: TrainingData? = nil, output: TrainingData? = nil, validation: ValidationData? = nil) {
            self.input = input
            self.output = output
            self.validation = validation
        }

        private enum CodingKeys: String, CodingKey {
            case input = "Input"
            case output = "Output"
            case validation = "Validation"
        }
    }

    public struct UnindexedFace: AWSDecodableShape {
        /// The structure that contains attributes of a face that IndexFacesdetected, but didn't index.
        public let faceDetail: FaceDetail?
        /// An array of reasons that specify why a face wasn't indexed.    EXTREME_POSE - The face is at a pose that can't be detected. For example, the head is turned too far away from the camera.   EXCEEDS_MAX_FACES - The number of faces detected is already higher than that specified by the MaxFaces input parameter for IndexFaces.   LOW_BRIGHTNESS - The image is too dark.   LOW_SHARPNESS - The image is too blurry.   LOW_CONFIDENCE - The face was detected with a low confidence.   SMALL_BOUNDING_BOX - The bounding box around the face is too small.
        public let reasons: [Reason]?

        @inlinable
        public init(faceDetail: FaceDetail? = nil, reasons: [Reason]? = nil) {
            self.faceDetail = faceDetail
            self.reasons = reasons
        }

        private enum CodingKeys: String, CodingKey {
            case faceDetail = "FaceDetail"
            case reasons = "Reasons"
        }
    }

    public struct UnsearchedFace: AWSDecodableShape {
        public let faceDetails: FaceDetail?
        ///  Reasons why a face wasn't used for Search.
        public let reasons: [UnsearchedFaceReason]?

        @inlinable
        public init(faceDetails: FaceDetail? = nil, reasons: [UnsearchedFaceReason]? = nil) {
            self.faceDetails = faceDetails
            self.reasons = reasons
        }

        private enum CodingKeys: String, CodingKey {
            case faceDetails = "FaceDetails"
            case reasons = "Reasons"
        }
    }

    public struct UnsuccessfulFaceAssociation: AWSDecodableShape {
        /// Match confidence with the UserID, provides information regarding if a face association was unsuccessful because it didn't meet UserMatchThreshold.
        public let confidence: Float?
        /// A unique identifier assigned to the face.
        public let faceId: String?
        ///  The reason why the association was unsuccessful.
        public let reasons: [UnsuccessfulFaceAssociationReason]?
        /// A provided ID for the UserID. Unique within the collection.
        public let userId: String?

        @inlinable
        public init(confidence: Float? = nil, faceId: String? = nil, reasons: [UnsuccessfulFaceAssociationReason]? = nil, userId: String? = nil) {
            self.confidence = confidence
            self.faceId = faceId
            self.reasons = reasons
            self.userId = userId
        }

        private enum CodingKeys: String, CodingKey {
            case confidence = "Confidence"
            case faceId = "FaceId"
            case reasons = "Reasons"
            case userId = "UserId"
        }
    }

    public struct UnsuccessfulFaceDeletion: AWSDecodableShape {
        ///  A unique identifier assigned to the face.
        public let faceId: String?
        /// The reason why the deletion was unsuccessful.
        public let reasons: [UnsuccessfulFaceDeletionReason]?
        ///  A provided ID for the UserID. Unique within the collection.
        public let userId: String?

        @inlinable
        public init(faceId: String? = nil, reasons: [UnsuccessfulFaceDeletionReason]? = nil, userId: String? = nil) {
            self.faceId = faceId
            self.reasons = reasons
            self.userId = userId
        }

        private enum CodingKeys: String, CodingKey {
            case faceId = "FaceId"
            case reasons = "Reasons"
            case userId = "UserId"
        }
    }

    public struct UnsuccessfulFaceDisassociation: AWSDecodableShape {
        /// A unique identifier assigned to the face.
        public let faceId: String?
        /// The reason why the deletion was unsuccessful.
        public let reasons: [UnsuccessfulFaceDisassociationReason]?
        /// A provided ID for the UserID. Unique within the collection.
        public let userId: String?

        @inlinable
        public init(faceId: String? = nil, reasons: [UnsuccessfulFaceDisassociationReason]? = nil, userId: String? = nil) {
            self.faceId = faceId
            self.reasons = reasons
            self.userId = userId
        }

        private enum CodingKeys: String, CodingKey {
            case faceId = "FaceId"
            case reasons = "Reasons"
            case userId = "UserId"
        }
    }

    public struct UntagResourceRequest: AWSEncodableShape {
        ///  Amazon Resource Name (ARN) of the model, collection, or stream processor that you want to remove the tags from.
        public let resourceArn: String
        ///  A list of the tags that you want to remove.
        public let tagKeys: [String]

        @inlinable
        public init(resourceArn: String, tagKeys: [String]) {
            self.resourceArn = resourceArn
            self.tagKeys = tagKeys
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, max: 2048)
            try self.validate(self.resourceArn, name: "resourceArn", parent: name, min: 20)
            try self.tagKeys.forEach {
                try validate($0, name: "tagKeys[]", parent: name, max: 128)
                try validate($0, name: "tagKeys[]", parent: name, min: 1)
                try validate($0, name: "tagKeys[]", parent: name, pattern: "^(?!aws:)[\\p{L}\\p{Z}\\p{N}_.:/=+\\-@]*$")
            }
            try self.validate(self.tagKeys, name: "tagKeys", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tagKeys = "TagKeys"
        }
    }

    public struct UntagResourceResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateDatasetEntriesRequest: AWSEncodableShape {
        ///  The changes that you want to make to the dataset.
        public let changes: DatasetChanges
        /// The Amazon Resource Name (ARN) of the dataset that you want to update.
        public let datasetArn: String

        @inlinable
        public init(changes: DatasetChanges, datasetArn: String) {
            self.changes = changes
            self.datasetArn = datasetArn
        }

        public func validate(name: String) throws {
            try self.changes.validate(name: "\(name).changes")
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, max: 2048)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, min: 20)
            try self.validate(self.datasetArn, name: "datasetArn", parent: name, pattern: "^(^arn:[a-z\\d-]+:rekognition:[a-z\\d-]+:\\d{12}:project\\/[a-zA-Z0-9_.\\-]{1,255}\\/dataset\\/(train|test)\\/[0-9]+$)$")
        }

        private enum CodingKeys: String, CodingKey {
            case changes = "Changes"
            case datasetArn = "DatasetArn"
        }
    }

    public struct UpdateDatasetEntriesResponse: AWSDecodableShape {
        public init() {}
    }

    public struct UpdateStreamProcessorRequest: AWSEncodableShape {
        ///  Shows whether you are sharing data with Rekognition to improve model performance. You can choose this option at the account level or on a per-stream basis. Note that if you opt out at the account level this setting is ignored on individual streams.
        public let dataSharingPreferenceForUpdate: StreamProcessorDataSharingPreference?
        ///  Name of the stream processor that you want to update.
        public let name: String
        ///  A list of parameters you want to delete from the stream processor.
        public let parametersToDelete: [StreamProcessorParameterToDelete]?
        ///  Specifies locations in the frames where Amazon Rekognition checks for objects or people. This is an optional parameter for label detection stream processors.
        public let regionsOfInterestForUpdate: [RegionOfInterest]?
        ///  The stream processor settings that you want to update. Label detection settings can be updated to detect different labels with a different minimum confidence.
        public let settingsForUpdate: StreamProcessorSettingsForUpdate?

        @inlinable
        public init(dataSharingPreferenceForUpdate: StreamProcessorDataSharingPreference? = nil, name: String, parametersToDelete: [StreamProcessorParameterToDelete]? = nil, regionsOfInterestForUpdate: [RegionOfInterest]? = nil, settingsForUpdate: StreamProcessorSettingsForUpdate? = nil) {
            self.dataSharingPreferenceForUpdate = dataSharingPreferenceForUpdate
            self.name = name
            self.parametersToDelete = parametersToDelete
            self.regionsOfInterestForUpdate = regionsOfInterestForUpdate
            self.settingsForUpdate = settingsForUpdate
        }

        public func validate(name: String) throws {
            try self.validate(self.name, name: "name", parent: name, max: 128)
            try self.validate(self.name, name: "name", parent: name, min: 1)
            try self.validate(self.name, name: "name", parent: name, pattern: "^[a-zA-Z0-9_.\\-]+$")
            try self.validate(self.regionsOfInterestForUpdate, name: "regionsOfInterestForUpdate", parent: name, max: 10)
            try self.settingsForUpdate?.validate(name: "\(name).settingsForUpdate")
        }

        private enum CodingKeys: String, CodingKey {
            case dataSharingPreferenceForUpdate = "DataSharingPreferenceForUpdate"
            case name = "Name"
            case parametersToDelete = "ParametersToDelete"
            case regionsOfInterestForUpdate = "RegionsOfInterestForUpdate"
            case settingsForUpdate = "SettingsForUpdate"
        }
    }

    public struct UpdateStreamProcessorResponse: AWSDecodableShape {
        public init() {}
    }

    public struct User: AWSDecodableShape {
        ///  A provided ID for the User. Unique within the collection.
        public let userId: String?
        ///  Communicates if the UserID has been updated with latest set of faces to be associated with the UserID.
        public let userStatus: UserStatus?

        @inlinable
        public init(userId: String? = nil, userStatus: UserStatus? = nil) {
            self.userId = userId
            self.userStatus = userStatus
        }

        private enum CodingKeys: String, CodingKey {
            case userId = "UserId"
            case userStatus = "UserStatus"
        }
    }

    public struct UserMatch: AWSDecodableShape {
        ///  Describes the UserID metadata.
        public let similarity: Float?
        ///  Confidence in the match of this UserID with the input face.
        public let user: MatchedUser?

        @inlinable
        public init(similarity: Float? = nil, user: MatchedUser? = nil) {
            self.similarity = similarity
            self.user = user
        }

        private enum CodingKeys: String, CodingKey {
            case similarity = "Similarity"
            case user = "User"
        }
    }

    public struct ValidationData: AWSDecodableShape {
        /// The assets that comprise the validation data.
        public let assets: [Asset]?

        @inlinable
        public init(assets: [Asset]? = nil) {
            self.assets = assets
        }

        private enum CodingKeys: String, CodingKey {
            case assets = "Assets"
        }
    }

    public struct Versions: AWSEncodableShape {
        /// The desired maximum version for the challenge.
        public let maximum: String?
        /// The desired minimum version for the challenge.
        public let minimum: String?

        @inlinable
        public init(maximum: String? = nil, minimum: String? = nil) {
            self.maximum = maximum
            self.minimum = minimum
        }

        public func validate(name: String) throws {
            try self.validate(self.maximum, name: "maximum", parent: name, max: 11)
            try self.validate(self.maximum, name: "maximum", parent: name, min: 5)
            try self.validate(self.maximum, name: "maximum", parent: name, pattern: "^(0|[1-9]\\d{0,2})\\.(0|[1-9]\\d{0,2})\\.(0|[1-9]\\d{0,2})$")
            try self.validate(self.minimum, name: "minimum", parent: name, max: 11)
            try self.validate(self.minimum, name: "minimum", parent: name, min: 5)
            try self.validate(self.minimum, name: "minimum", parent: name, pattern: "^(0|[1-9]\\d{0,2})\\.(0|[1-9]\\d{0,2})\\.(0|[1-9]\\d{0,2})$")
        }

        private enum CodingKeys: String, CodingKey {
            case maximum = "Maximum"
            case minimum = "Minimum"
        }
    }

    public struct Video: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon S3 bucket name and file name for the video.
        public let s3Object: S3Object?

        @inlinable
        public init(s3Object: S3Object? = nil) {
            self.s3Object = s3Object
        }

        public func validate(name: String) throws {
            try self.s3Object?.validate(name: "\(name).s3Object")
        }

        private enum CodingKeys: String, CodingKey {
            case s3Object = "S3Object"
        }
    }

    public struct VideoMetadata: AWSDecodableShape {
        /// Type of compression used in the analyzed video.
        public let codec: String?
        ///  A description of the range of luminance values in a video, either LIMITED (16 to 235) or FULL (0 to 255).
        public let colorRange: VideoColorRange?
        /// Length of the video in milliseconds.
        public let durationMillis: Int64?
        /// Format of the analyzed video. Possible values are MP4, MOV and AVI.
        public let format: String?
        /// Vertical pixel dimension of the video.
        public let frameHeight: Int64?
        /// Number of frames per second in the video.
        public let frameRate: Float?
        /// Horizontal pixel dimension of the video.
        public let frameWidth: Int64?

        @inlinable
        public init(codec: String? = nil, colorRange: VideoColorRange? = nil, durationMillis: Int64? = nil, format: String? = nil, frameHeight: Int64? = nil, frameRate: Float? = nil, frameWidth: Int64? = nil) {
            self.codec = codec
            self.colorRange = colorRange
            self.durationMillis = durationMillis
            self.format = format
            self.frameHeight = frameHeight
            self.frameRate = frameRate
            self.frameWidth = frameWidth
        }

        private enum CodingKeys: String, CodingKey {
            case codec = "Codec"
            case colorRange = "ColorRange"
            case durationMillis = "DurationMillis"
            case format = "Format"
            case frameHeight = "FrameHeight"
            case frameRate = "FrameRate"
            case frameWidth = "FrameWidth"
        }
    }

    public struct VideoTooLargeException: AWSErrorShape {
        public let code: String?
        /// A universally unique identifier (UUID) for the request.
        public let logref: String?
        public let message: String?

        @inlinable
        public init(code: String? = nil, logref: String? = nil, message: String? = nil) {
            self.code = code
            self.logref = logref
            self.message = message
        }

        private enum CodingKeys: String, CodingKey {
            case code = "Code"
            case logref = "Logref"
            case message = "Message"
        }
    }
}

// MARK: - Errors

/// Error enum for Rekognition
public struct RekognitionErrorType: AWSErrorType {
    enum Code: String {
        case accessDeniedException = "AccessDeniedException"
        case conflictException = "ConflictException"
        case humanLoopQuotaExceededException = "HumanLoopQuotaExceededException"
        case idempotentParameterMismatchException = "IdempotentParameterMismatchException"
        case imageTooLargeException = "ImageTooLargeException"
        case internalServerError = "InternalServerError"
        case invalidImageFormatException = "InvalidImageFormatException"
        case invalidManifestException = "InvalidManifestException"
        case invalidPaginationTokenException = "InvalidPaginationTokenException"
        case invalidParameterException = "InvalidParameterException"
        case invalidPolicyRevisionIdException = "InvalidPolicyRevisionIdException"
        case invalidS3ObjectException = "InvalidS3ObjectException"
        case limitExceededException = "LimitExceededException"
        case malformedPolicyDocumentException = "MalformedPolicyDocumentException"
        case provisionedThroughputExceededException = "ProvisionedThroughputExceededException"
        case resourceAlreadyExistsException = "ResourceAlreadyExistsException"
        case resourceInUseException = "ResourceInUseException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case resourceNotReadyException = "ResourceNotReadyException"
        case serviceQuotaExceededException = "ServiceQuotaExceededException"
        case sessionNotFoundException = "SessionNotFoundException"
        case throttlingException = "ThrottlingException"
        case videoTooLargeException = "VideoTooLargeException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize Rekognition
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// You are not authorized to perform the action.
    public static var accessDeniedException: Self { .init(.accessDeniedException) }
    ///  A User with the same Id already exists within the collection, or the update or deletion of the User caused an inconsistent state. **
    public static var conflictException: Self { .init(.conflictException) }
    /// The number of in-progress human reviews you have has exceeded the number allowed.
    public static var humanLoopQuotaExceededException: Self { .init(.humanLoopQuotaExceededException) }
    /// A ClientRequestToken input parameter was reused with an operation, but at least one of the other input parameters is different from the previous call to the operation.
    public static var idempotentParameterMismatchException: Self { .init(.idempotentParameterMismatchException) }
    /// The input image size exceeds the allowed limit. If you are calling DetectProtectiveEquipment, the image size or resolution exceeds the allowed limit. For more information, see Guidelines and quotas in Amazon Rekognition in the Amazon Rekognition Developer Guide.
    public static var imageTooLargeException: Self { .init(.imageTooLargeException) }
    /// Amazon Rekognition experienced a service issue. Try your call again.
    public static var internalServerError: Self { .init(.internalServerError) }
    /// The provided image format is not supported.
    public static var invalidImageFormatException: Self { .init(.invalidImageFormatException) }
    /// Indicates that a provided manifest file is empty or larger than the allowed limit.
    public static var invalidManifestException: Self { .init(.invalidManifestException) }
    /// Pagination token in the request is not valid.
    public static var invalidPaginationTokenException: Self { .init(.invalidPaginationTokenException) }
    /// Input parameter violated a constraint. Validate your parameter before calling the API operation again.
    public static var invalidParameterException: Self { .init(.invalidParameterException) }
    /// The supplied revision id for the project policy is invalid.
    public static var invalidPolicyRevisionIdException: Self { .init(.invalidPolicyRevisionIdException) }
    /// Amazon Rekognition is unable to access the S3 object specified in the request.
    public static var invalidS3ObjectException: Self { .init(.invalidS3ObjectException) }
    /// An Amazon Rekognition service limit was exceeded. For example, if you start too many jobs concurrently, subsequent calls to start operations (ex: StartLabelDetection) will raise a LimitExceededException exception (HTTP status code: 400) until the number of concurrently running jobs is below the Amazon Rekognition service limit.
    public static var limitExceededException: Self { .init(.limitExceededException) }
    /// The format of the project policy document that you supplied to  PutProjectPolicy is incorrect.
    public static var malformedPolicyDocumentException: Self { .init(.malformedPolicyDocumentException) }
    /// The number of requests exceeded your throughput limit. If you want to increase this limit, contact Amazon Rekognition.
    public static var provisionedThroughputExceededException: Self { .init(.provisionedThroughputExceededException) }
    /// A resource with the specified ID already exists.
    public static var resourceAlreadyExistsException: Self { .init(.resourceAlreadyExistsException) }
    /// The specified resource is already being used.
    public static var resourceInUseException: Self { .init(.resourceInUseException) }
    /// The resource specified in the request cannot be found.
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The requested resource isn't ready. For example,   this exception occurs when you call DetectCustomLabels with a model version that isn't deployed.
    public static var resourceNotReadyException: Self { .init(.resourceNotReadyException) }
    ///  The size of the collection exceeds the allowed limit. For more information, see Guidelines and quotas in Amazon Rekognition in the Amazon Rekognition Developer Guide.
    public static var serviceQuotaExceededException: Self { .init(.serviceQuotaExceededException) }
    /// Occurs when a given sessionId is not found.
    public static var sessionNotFoundException: Self { .init(.sessionNotFoundException) }
    /// Amazon Rekognition is temporarily unable to process the request. Try your call again.
    public static var throttlingException: Self { .init(.throttlingException) }
    /// The file size or duration of the supplied media is too large. The maximum file size is 10GB. The maximum duration is 6 hours.
    public static var videoTooLargeException: Self { .init(.videoTooLargeException) }
}

extension RekognitionErrorType: AWSServiceErrorType {
    public static let errorCodeMap: [String: AWSErrorShape.Type] = [
        "AccessDeniedException": Rekognition.AccessDeniedException.self,
        "ConflictException": Rekognition.ConflictException.self,
        "HumanLoopQuotaExceededException": Rekognition.HumanLoopQuotaExceededException.self,
        "IdempotentParameterMismatchException": Rekognition.IdempotentParameterMismatchException.self,
        "ImageTooLargeException": Rekognition.ImageTooLargeException.self,
        "InternalServerError": Rekognition.InternalServerError.self,
        "InvalidImageFormatException": Rekognition.InvalidImageFormatException.self,
        "InvalidManifestException": Rekognition.InvalidManifestException.self,
        "InvalidPaginationTokenException": Rekognition.InvalidPaginationTokenException.self,
        "InvalidParameterException": Rekognition.InvalidParameterException.self,
        "InvalidPolicyRevisionIdException": Rekognition.InvalidPolicyRevisionIdException.self,
        "InvalidS3ObjectException": Rekognition.InvalidS3ObjectException.self,
        "LimitExceededException": Rekognition.LimitExceededException.self,
        "MalformedPolicyDocumentException": Rekognition.MalformedPolicyDocumentException.self,
        "ProvisionedThroughputExceededException": Rekognition.ProvisionedThroughputExceededException.self,
        "ResourceAlreadyExistsException": Rekognition.ResourceAlreadyExistsException.self,
        "ResourceInUseException": Rekognition.ResourceInUseException.self,
        "ResourceNotFoundException": Rekognition.ResourceNotFoundException.self,
        "ResourceNotReadyException": Rekognition.ResourceNotReadyException.self,
        "ServiceQuotaExceededException": Rekognition.ServiceQuotaExceededException.self,
        "SessionNotFoundException": Rekognition.SessionNotFoundException.self,
        "ThrottlingException": Rekognition.ThrottlingException.self,
        "VideoTooLargeException": Rekognition.VideoTooLargeException.self
    ]
}

extension RekognitionErrorType: Equatable {
    public static func == (lhs: RekognitionErrorType, rhs: RekognitionErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension RekognitionErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
